error al asignar Layout: BoxLayout no se puede compartir

114

Tengo esta JFrameclase de Java , en la que quiero usar un diseño de caja, pero aparece un error que dice java.awt.AWTError: BoxLayout can't be shared. He visto a otros con este problema, pero lo resolvieron creando el diseño de cuadro en el panel de contenido, pero eso es lo que estoy haciendo aquí. Aquí está mi 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);
    }
}
Neurona
fuente

Respuestas:

173

Su problema es que está creando un BoxLayoutpara a JFrame( this), pero configurándolo como el diseño para a JPanel( getContentPane()). Tratar:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
Michael Myers
fuente
5
Sí, pero eliminarlo confundiría el problema, ¿no es así?
Michael Myers
75

También encontré este error al hacer esto:

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

El JPanel aún no se ha inicializado al pasarlo al BoxLayout. Así que divide esta línea así:

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

Esto funcionará.

Joaquín M
fuente
16

Creo que una cosa importante para resaltar de las respuestas anteriores es que el objetivo de BoxLayout (el primer parámetro) debe ser el mismo contenedor al que se llama el método setLayout como en el siguiente ejemplo:

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

Si está usando el diseño en un me JFramegusta:

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

El control en realidad se está agregando al, ContentPanepor lo que parecerá que está 'compartido' entre el JFramey elContentPane

Haz esto en su lugar:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));
Charlie
fuente
Dang, me salvaste, ¿por qué esta es la única respuesta que menciona getContentPane ()?
Alexander McNulty
@AlexanderMcNulty, probablemente porque los JFrames normalmente no lo requieren (a diferencia del AWT Frame). A partir de la JFramedocumentación: 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 están refiriendo a un JFrameejemplo.
alife
@AlexanderMcNulty, además, solo hay un panel de contenido en un JFrame, y siempre se garantiza que estará allí.
alife