web-dev-qa-db-fra.com

BoxLayout ne peut pas être partagé erreur

J'ai cette Java JFrame classe, dans laquelle je veux utiliser un Boxlayout, mais j'obtiens une erreur en disant Java.awt.AWTError: BoxLayout can't be shared. J'en ai vu d'autres avec ce problème, mais ils l'ont résolu en créant la boîte de dialogue sur le panneau de contenu, 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);
    }
}
111
Ulrik

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

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
166
Michael Myers

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é lorsqu’il passe au BoxLayout. Alors divisez cette ligne comme ceci:

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

Cela fonctionnera.

72
Joaquín M

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

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

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 de sorte qu'il aura l'air d'être 'partagé' entre le 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!"));
4
Charlie