2009-04-17 15 views
107

Tengo esta clase Java JFrame, en la que quiero utilizar un boxlayout, pero me sale un error que dice java.awt.AWTError: BoxLayout can't be shared. He visto a otros con este problema, pero lo resolvieron creando la caja en el panel de contenido, pero eso es lo que estoy haciendo aquí. Aquí está mi código:BoxLayout no se puede compartir error

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

Respuesta

156

Su problema es que se está creando un BoxLayout para un JFrame (this), pero configurándolo como el diseño de una JPanel (getContentPane()). Proveedores:

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

Gracias, funcionó a la perfección: D –

+1

Por supuesto que no es necesario el primer getContentPane ... :-) –

+5

Sí, pero la eliminación sería confundir el tema, ahora ¿no? –

61

También he encontrado este error hacer esto:

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

El JPanel no se ha iniciado aún cuando se pasa a la BoxLayout. Así que divida esta línea así:

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

Esto funcionará.

+0

acaba de toparse con esto. ¡Gracias! – anon58192932

+0

Acabo de recibir este mismo problema, gracias – Darc

+0

SÍ MUCHAS GRACIAS: D –

13

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

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

Buen principio =] – dmonopoly

0

Si está utilizando el diseño en un JFrame como:

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

es en realidad se agrega el control a la ContentPane lo que se verá como que está 'compartida' entre el JFrame y el ContentPane

hacer esto en su lugar:

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