BoxLayout ne peut pas être une erreur partagée

J’ai cette classe Java JFrame , dans laquelle je veux utiliser un boxlayout, mais j’ai une erreur en disant java.awt.AWTError: BoxLayout can't be shared . J’ai vu d’autres personnes avec ce problème, mais elles ont résolu le problème en créant le boxlayout sur contentpane, mais c’est ce que je fais ici. Voici mon code:

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

Votre problème est que vous créez un BoxLayout pour un JFrame ( this ), mais en le définissant comme la disposition d’un JPanel ( getContentPane() ). Essayer:

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

J’ai aussi trouvé cette erreur en faisant ceci:

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

Le JPanel n’est pas encore initialisé lors du transfert à BoxLayout. Alors, divisez cette ligne comme ceci:

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

Cela fonctionnera.

Je pense que l’une des choses importantes à souligner dans les réponses précédentes est que la cible de BoxLayout (le premier paramètre) devrait être le même que celui utilisé dans la méthode setLayout, comme dans l’exemple suivant:

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

Si vous utilisez la mise en page sur un JFrame comme:

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

Le contrôle est en fait ajouté au ContentPane , il ContentPane donc être «partagé» entre JFrame et le ContentPane

Faites ceci à la place:

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