erreur lors de l'attribution de la mise en page: BoxLayout ne peut pas être partagé


114

J'ai cette JFrameclasse Java , dans laquelle je veux utiliser un boxlayout, mais j'obtiens une erreur 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 le boxlayout sur le volet de contenu, mais c'est ce que je fais ici. Voici mon code:

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

Réponses:


173

Votre problème est que vous créez un BoxLayoutpour a JFrame( this), mais que vous le définissez comme disposition pour a JPanel( getContentPane()). Essayer:

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

5
Oui, mais le supprimer brouillerait le problème, non?
Michael Myers

75

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é lors de son passage au BoxLayout. Alors divisez cette ligne comme ceci:

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

Cela fonctionnera.


16

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

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

6

Si vous utilisez la mise en page sur un JFramelike:

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é à la ContentPane, il semblera donc `` partagé '' entre le JFrameet leContentPane

Faites ceci à la place:

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

Dang vous m'avez sauvé, - pourquoi est-ce la seule réponse qui mentionne getContentPane ()?
Alexander McNulty

@AlexanderMcNulty, probablement parce que les JFrames n'en ont normalement pas besoin (contrairement à l'AWT Frame). De la JFramedocumentation: 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. En frameils se réfèrent à une JFrameinstance.
alife le

@AlexanderMcNulty, en outre, il n'y a qu'un seul volet de contenu dans un JFrame, et il est toujours garanti d'être là.
alife le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.