Je travaille sur une interface graphique très simple en Java.
Dans cette interface graphique, je veux afficher:
Voici mon code:
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Prova {
public static void main(String[] args) {
JFrame frame = new JFrame("A Simple GUI");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocation(430, 100);
JPanel panel = new JPanel();
frame.add(panel);
JLabel lbl = new JLabel("Select one of the possible choices and click OK");
lbl.setVisible(true);
panel.add(lbl);
String[] choices = { "CHOICE 1","CHOICE 2", "CHOICE 3","CHOICE 4","CHOICE 5","CHOICE 6"};
final JComboBox<String> cb = new JComboBox<String>(choices);
cb.setVisible(true);
panel.add(cb);
JButton btn = new JButton("OK");
panel.add(btn);
}
}
Malheureusement, le résultat obtenu est
Comme vous pouvez le voir sur l'image, l'étiquette, le JComboBox et le JButton sont sur la même ligne!
Au lieu de cela, je les veux "empilés" comme décrit ci-dessus:
JLabel
JComboBox
JButton
J'ai essayé d'utiliser la méthode setLocation (int x, int y), mais elles apparaissent toujours à la même position.
Merci beaucoup!
utilisez frame.setLayout(null);
cela vous permettra de placer l’étiquette, le bouton, etc. où vous le souhaitez
Vous devez utiliser l'un des modèles standard Java (GridLayout, LinearLayout, BoxLayout).
Je recommande d'utiliser une grille avec 1 colonne et 3 lignes
comme ci-dessous
setLayout(new GridLayout(1,3));
add(new Button("1"));
add(new Button("2"));
add(new Button("3"));
C'est dû à la disposition qui est utilisée pour aligner les enfants. Par défaut, son FlowLayout, qui contient tous les composants enfants dans un flux allant de gauche à droite, donne l'affichage ci-dessus.
Vous pouvez utiliser un GridLayout avec 3 lignes et 1 colonne selon vos besoins.
Si j'ai bien compris votre question, le code suivant accomplit ce que vous essayez de faire sans être trop compliqué:
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.BoxLayout; // added code
import Java.awt.Component; // added code
public class Prova {
public static void main(String[] args) {
JFrame frame = new JFrame("A Simple GUI");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocation(430, 100);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // added code
frame.add(panel);
JLabel lbl = new JLabel("Select one of the possible choices and click OK");
lbl.setAlignmentX(Component.CENTER_ALIGNMENT);
//lbl.setVisible(true); // Not needed
panel.add(lbl);
String[] choices = { "CHOICE 1", "CHOICE 2", "CHOICE 3", "CHOICE 4",
"CHOICE 5", "CHOICE 6" };
final JComboBox<String> cb = new JComboBox<String>(choices);
cb.setMaximumSize(cb.getPreferredSize()); // added code
cb.setAlignmentX(Component.CENTER_ALIGNMENT);// added code
//cb.setVisible(true); // Not needed
panel.add(cb);
JButton btn = new JButton("OK");
btn.setAlignmentX(Component.CENTER_ALIGNMENT); // added code
panel.add(btn);
frame.setVisible(true); // added code
}
}
La méthode setLocation
est souvent trop compliquée à moins d’avoir des objectifs très spécifiques (artistiques?) Pour la mise en page. Pour ce problème, une solution plus simple consiste à utiliser BoxLayout
et à spécifier que vous souhaitez ajouter des éléments dans la direction y (verticalement vers le bas). Notez que vous devrez spécifier les dimensions de JComboBox
vouloir ajouter plus tard) pour éviter un menu déroulant géant. cf. un autre article stackoverflow, JComboBox width
Étudiez quelques tutoriels sur l’utilisation des gestionnaires de disposition, c’est là que vous trouverez la solution. Ils sont assez difficiles cependant.