127 votes

Erreur : BoxLayout ne peut pas être partagé

J'ai ce Java JFrame dans laquelle je veux utiliser un boxlayout, mais j'obtiens une erreur disant que java.awt.AWTError: BoxLayout can't be shared . J'ai vu d'autres personnes avec ce problème, mais elles l'ont résolu en créant le boxlayout sur le 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);
    }
}

191voto

Michael Myers Points 82361

Votre problème est que vous créez un BoxLayout pour un JFrame ( this ), mais en le définissant comme la mise en page d'une JPanel ( getContentPane() ). Essayez :

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

6 votes

Oui, mais le supprimer rendrait la question confuse, n'est-ce pas ?

84voto

Joaquín M Points 620

J'ai également trouvé cette erreur en faisant ceci :

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

Le JPanel n'est pas encore initialisé lorsqu'il est transmis au BoxLayout. Donc divisez cette ligne comme ceci :

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

Ça va marcher.

17voto

diadyne Points 1093

Je pense qu'une chose importante à souligner dans les réponses précédentes est que la cible du BoxLayout (le premier paramètre) doit être le même conteneur que celui sur lequel la méthode setLayout est appelée comme dans l'exemple suivant :

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

15voto

Charlie Points 1056

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 pour qu'il ait l'air d'être "partagé" entre les deux parties. JFrame et le ContentPane

Faites plutôt ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X