fout bij het toewijzen van lay-out: BoxLayout kan niet worden gedeeld

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 BoxLayoutmaakt 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 JFramezoals:

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 JFrameen 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!"));

Other episodes