Fehler beim Zuweisen von Layout: BoxLayout kann nicht freigegeben werden

114

Ich habe diese Java- JFrameKlasse, in der ich ein Boxlayout verwenden möchte, aber es wird eine Fehlermeldung angezeigt java.awt.AWTError: BoxLayout can't be shared. Ich habe andere mit diesem Problem gesehen, aber sie haben es gelöst, indem sie das Boxlayout im Inhaltsbereich erstellt haben, aber genau das mache ich hier. Hier ist mein 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);
    }
}
Neuron
quelle

Antworten:

173

Ihr Problem ist, dass Sie ein BoxLayoutfür a JFrame( this) erstellen , es aber als Layout für ein JPanel( getContentPane()) festlegen . Versuchen:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
Michael Myers
quelle
5
Ja, aber das Entfernen würde das Problem verwirren, nicht wahr?
Michael Myers
75

Ich habe auch diesen Fehler gefunden, der Folgendes verursacht:

JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

Das JPanel ist noch nicht initialisiert, wenn es an das BoxLayout übergeben wird. Teilen Sie diese Zeile also folgendermaßen auf:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

Das wird funktionieren.

Joaquín M.
quelle
16

Ich denke, dass eine wichtige Sache, die aus den vorherigen Antworten hervorgehoben werden muss, ist, dass das Ziel des BoxLayout (der erste Parameter) derselbe Container sein sollte, auf den die setLayout-Methode aufgerufen wird, wie im folgenden Beispiel:

JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));
Diadyne
quelle
5

Wenn Sie das Layout JFramewie folgt verwenden :

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

Das Steuerelement wird tatsächlich zum hinzugefügt, ContentPanesodass es so aussieht, als ob es zwischen dem JFrameund dem "geteilt" wirdContentPane

Tun Sie dies stattdessen:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));
Charlie
quelle
Dang du hast mich gerettet, - warum ist dies die einzige Antwort, die getContentPane () erwähnt?
Alexander McNulty
@AlexanderMcNulty, wahrscheinlich, weil JFramees normalerweise nicht benötigt wird (im Gegensatz zum AWT Frame). Aus der JFrameDokumentation: As a convenience, the add, remove, and setLayout methods of this class are overridden, so that they delegate calls to the corresponding methods of the ContentPane. For example, you can add a child component to a frame as follows: frame.add(child); And the child will be added to the contentPane. The content pane will always be non-null. Indem framesie sich auf eine JFrameInstanz beziehen .
Alife
@AlexanderMcNulty, außerdem gibt es in einem JFrame nur einen Inhaltsbereich, der garantiert immer vorhanden ist.
Alife