BoxLayout non può essere un errore condiviso

Ho questa class Java JFrame , in cui voglio usare un boxlayout, ma ho 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 sul contentpane, ma è quello che sto facendo qui. Ecco il mio codice:

 class edit_dialog extends javax.swing.JFrame{ javax.swing.JTextField title = new javax.swing.JTextField(); public edit_dialog(){ setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); setTitle("New entity"); getContentPane().setLayout( new javax.swing.BoxLayout(this, javax.swing.BoxLayout.PAGE_AXIS)); add(title); pack(); setVisible(true); } } 

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

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

Ho anche trovato questo errore nel fare questo:

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

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

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

Questo funzionerà.

Penso che una cosa importante da evidenziare dalle risposte precedenti sia che il target di BoxLayout (il primo parametro) dovrebbe essere lo stesso contenitore in cui viene chiamato il metodo setLayout come nel seguente esempio:

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

Se stai usando il layout su un JFrame come:

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

Il controllo viene effettivamente aggiunto a ContentPane modo che assomigli a “condiviso” tra ContentPane e ContentPane

Fatelo invece:

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