erro ao atribuir Layout: BoxLayout não pode ser compartilhado


114

Eu tenho essa JFrameclasse Java , na qual desejo usar um boxlayout, mas recebo um erro dizendo java.awt.AWTError: BoxLayout can't be shared. Já vi outros com esse problema, mas eles o resolveram criando o boxlayout no painel de conteúdo, mas é isso que estou fazendo aqui. Este é meu código:

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

Respostas:


173

Seu problema é que você está criando um BoxLayoutpara a JFrame( this), mas definindo-o como o layout para a JPanel( getContentPane()). Experimentar:

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

5
Sim, mas removê-lo confundiria o problema, não é mesmo?
Michael Myers

75

Também encontrei este erro ao fazer isto:

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

O JPanel ainda não foi inicializado ao passá-lo para o BoxLayout. Então, divida esta linha assim:

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

Isso vai funcionar.


16

Acho que uma coisa importante a destacar das respostas anteriores é que o destino do BoxLayout (o primeiro parâmetro) deve ser o mesmo Container que o método setLayout está sendo chamado, como no exemplo a seguir:

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

5

Se você estiver usando o layout de uma forma JFramesemelhante:

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

O controle está realmente sendo adicionado ao ContentPanepara parecer que está "compartilhado" entre o JFramee oContentPane

Em vez disso, faça isso:

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

Caramba, você me salvou, - por que esta é a única resposta que menciona getContentPane ()?
Alexander McNulty

@AlexanderMcNulty, provavelmente porque JFrames normalmente não o exigem (ao contrário do AWT Frame). Da JFramedocumentação: 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. Por framese referir a uma JFrameinstância.
alife

@AlexanderMcNulty, além disso, há apenas um painel de conteúdo em um JFrame e é sempre garantido que ele estará lá.
alife
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.