errore durante l'assegnazione del layout: BoxLayout non può essere condiviso


114

Ho questa JFrameclasse Java , in cui voglio usare un boxlayout, ma ottengo un errore che dice java.awt.AWTError: BoxLayout can't be shared. Ho visto altri con questo problema, ma l'hanno risolto creando il boxlayout nel riquadro dei contenuti, ma è quello che sto facendo qui. Ecco il mio codice:

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);
    }
}

Risposte:


173

Il tuo problema è che stai creando un BoxLayoutper a JFrame( this), ma impostandolo come layout per a JPanel( getContentPane()). Provare:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);

5
Sì, ma rimuoverlo confonderebbe il problema, ora no?
Michael Myers

75

Ho anche trovato questo errore nel fare questo:

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

Il JPanel non è ancora inizializzato quando lo si passa a BoxLayout. Quindi dividi questa linea in questo modo:

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

Questo funzionerà.


16

Penso che una cosa importante da evidenziare dalle risposte precedenti sia che l'obiettivo di BoxLayout (il primo parametro) dovrebbe essere lo stesso Container su cui viene chiamato il metodo setLayout come nell'esempio seguente:

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

6

Se stai utilizzando il layout su un Mi JFramepiace:

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

Il controllo viene effettivamente aggiunto a, ContentPanequindi sembrerà che sia "condiviso" tra JFrameeContentPane

Fai questo invece:

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

Dang mi hai salvato, - perché questa è l'unica risposta che menziona getContentPane ()?
Alexander McNulty

@AlexanderMcNulty, probabilmente perché JFramenormalmente non lo richiedono (a differenza dell'AWT Frame). Dalla JFramedocumentazione: 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. Con framesi riferiscono a JFrameun'istanza.
alife

@AlexanderMcNulty, inoltre, c'è solo un riquadro del contenuto in un JFrame, ed è sempre garantito che sia lì.
alife
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.