Ik werk aan een zeer eenvoudige GUI in Java.
In deze GUI wil ik weergeven:
- Een label met wat tekst bovenaan de pagina
- Een JComboBox onder het genoemde label
- Een JButton onder de genoemde JComboBox
Hier is mijn 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);
}
}
Helaas is het resultaat dat ik krijg
Zoals je kunt zien in de afbeelding, staan het label, de JComboBox en de JButton op dezelfde lijn!
In plaats daarvan wil ik ze “gestapeld” zoals hierboven beschreven:
JLabel
JComboBox
JKnop
Ik heb geprobeerd de methode setLocation(int x, int y) te gebruiken, maar ze worden altijd op dezelfde positie weergegeven.
Hartelijk dank!
Antwoord 1, autoriteit 100%
gebruik frame.setLayout(null);
hiermee kunt u het label, de knop enz. plaatsen waar u maar wilt
Antwoord 2, autoriteit 67%
U moet een Java-standaardlay-out gebruiken (GridLayout, LinearLayout, BoxLayout)
Ik raad aan om een rasterlay-out te gebruiken met 1 kolom en 3 rijen
zoals hieronder
setLayout(new GridLayout(1,3));
add(new Button("1"));
add(new Button("2"));
add(new Button("3"));
Antwoord 3, autoriteit 67%
Als ik je vraag heb begrepen, volbrengt de volgende code wat je probeert te doen zonder al te ingewikkeld te zijn:
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
}
}
De setLocation
methode is vaak te ingewikkeld, tenzij je heel specifieke (artistieke?) doelen voor de lay-out hebt. Voor dit probleem is een eenvoudigere oplossing om een BoxLayout
te gebruiken en aan te geven dat je dingen wilt toevoegen in de y-richting (verticaal naar beneden). Merk op dat je de afmetingen van de JComboBox
(en enkele andere GUI-elementen die u later misschien wilt toevoegen) om een gigantisch vervolgkeuzemenu te vermijden. vgl. nog een stackoverflow-bericht, JComboBox-breedte
Antwoord 4, autoriteit 50%
Het komt door de lay-out die wordt gebruikt om de kinderen uit te lijnen. Standaard is het de FlowLayout die alle onderliggende componenten in een stroom plaatst, beginnend van links naar rechts en vandaar dat je de bovenstaande weergave krijgt.
U kunt een GridLayout gebruiken met 3 rijen en 1 kolom volgens uw vereisten.
Antwoord 5, autoriteit 17%
Bestudeer enkele tutorials over het gebruik van lay-outmanagers, daar vindt u de oplossing. Ze zijn echter behoorlijk taai.
Antwoord 6
gebruik Panel.setLayout(null);
en gebruik setBounds voor elk onderdeel om ze naar keuze te plaatsen
bv:
JButton btn=new JButton("Press");
btn.setBounds(10, 10, 100, 20);//where(x, y, length, height)
JPanel.add(btn);//this is just a snippet, you will have to declare an object
//for the JPanel:)