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);
    }
}
Neurone
la source

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)
);
Michael Myers
la source
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.

Joaquín M
la source
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));
diadyne
la source
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!"));
Charlie
la source
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