Ik heb deze Java JFrame
-klasse, waarin ik een boxlayout wil gebruiken, maar ik krijg de foutmelding java.awt.AWTError: BoxLayout can't be shared
. Ik heb anderen met dit probleem gezien, maar ze hebben het opgelost door de boxlay-out in het inhoudvenster te maken, maar dat is wat ik hier doe. Hier is mijn code:
class EditDialog extends JFrame {
JTextField title = new JTextField();
public editDialog() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("New entity");
getContentPane().setLayout(
new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(title);
pack();
setVisible(true);
}
}
Antwoord 1, autoriteit 100%
Uw probleem is dat u een BoxLayout
maakt voor een JFrame
(this
), maar deze instelt als de lay-out voor een JPanel
(getContentPane()
). Probeer:
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
Antwoord 2, autoriteit 43%
Ik heb ook deze fout gevonden door dit te maken:
JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
Het JPanel is nog niet geïnitialiseerd wanneer het wordt doorgegeven aan de BoxLayout. Dus splits deze regel als volgt:
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
Dit zal werken.
Antwoord 3, autoriteit 9%
Ik denk dat een belangrijk ding om te benadrukken uit de vorige antwoorden is dat het doel van BoxLayout (de eerste parameter) dezelfde container moet zijn als de setLayout-methode, zoals in het volgende voorbeeld:
JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));
Antwoord 4, autoriteit 6%
Als je de lay-out gebruikt op een JFrame
zoals:
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));
Het besturingselement wordt daadwerkelijk toegevoegd aan het ContentPane
, dus het lijkt alsof het wordt ‘gedeeld’ tussen het JFrame
en het ContentPane
Doe dit in plaats daarvan:
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));