2011-12-28 30 views
10

Acabo de escribir un código simple donde quiero que aparezca un campo de texto y un botón en el cuadro principal, pero después de ejecutar todo lo que veo es el campo de texto.Java Swing JFrame Layout

Si escribo el código del botón después del campo de texto, solo se muestra el botón.

¿Alguna idea de por qué?

JFrame mainframe=new JFrame(); 
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainframe.setBounds(0,0,200,200); 
    JButton jb=new JButton(); 
    jb.setText("Leech"); 
    mainframe.add(jb); 
    JTextField link=new JTextField(50); 
    mainframe.add(link); 
    mainframe.pack(); 
    mainframe.setVisible(true); 
+0

javadoc La clase establece claramente que se puede llamar añadir también, que se sumará al panel de contenido. Al menos en las versiones más recientes de Java, la documentación 1.3 a la que se refiere – Robin

Respuesta

5

Agregue sus componentes a un JPanel y luego agregue ese panel al panel de contenido de JFrame.

  
     JFrame window = new JFrame(); 
     JPanel mainframe=new JPanel(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setBounds(0,0,200,200); 
     JButton jb=new JButton(); 
     jb.setText("Leech"); 
     mainframe.add(jb); 
     JTextField link=new JTextField(50); 
     mainframe.add(link); 
     window.getContentPane().add(mainframe); 
     window.pack(); 
     window.setVisible(true);
+3

que es básicamente lo mismo que configurar 'FlowLayout' como' LayoutManager' en 'JFrame', ya que ese es el diseño predeterminado del' JPanel' – Robin

+1

No puedo creer que esta sea la respuesta aceptada. La respuesta de Robin a continuación es la respuesta correcta. Solo tengo que entender cuál es el administrador de diseño predeterminado de un JFrame y la posición predeterminada a la que se agrega algo en un BorderLayout si no se especifica uno. – Michael

+0

@Michael ¿Cuál es el sentido de tu comentario? ¿Crees que esta respuesta es incorrecta o no te gusta cómo está codificada de esa manera? – Ibrahim

9

En lugar de añadir directamente Componentes al JFrame, utilice un JPanel como recipiente con la LayoutManager deseado.

Here puede encontrar varios tutoriales sobre los administradores de diseño.

Básicamente en Swing, LayoutManager es responsable de diseñar los componentes para niños (estableciendo su posición y su tamaño), por lo que cada componente de contenedor que use dentro de su aplicación debe configurarse con el Administrador de diseños adecuado.

+0

El enlace en LayoutManager ahora está muerto. Por favor, arregla. – Ungeheuer

11

El diseño predeterminado en un JFrame es un BorderLayout. Llamar al método add en un Container con dicho diseño es equivalente a una llamada add(..., BorderLayout.CENTER). Cada una de las ubicaciones de BorderLayout puede contener solo un elemento. Por lo tanto, al hacer dos llamadas

mainframe.add(jb); 
mainframe.add(link); 

resulta en un CENTRO que contiene el último componente que ha agregado. Si desea evitar esto, puede agregarlo a diferentes ubicaciones o utilizar otro administrador de diseño (por ejemplo, FlowLayout) llamando al JFrame#setLayout

0

El Administrador de diseño predeterminado de JFrame es BorderLayout. Si desea que el diseño automático, es posible utilizar el FlowLayout:

mainframe.setLayout(new FlowLayout()); 

Si desea especificar las coordenadas de setBounds() método, tiene que cancelar el ajuste del controlador de distribución sobre JFrame:

mainframe.setLayout(null); 
jb.setBounds(10,10,100,50); 
link.setBounds(10,70,180,100); 
+0

Nunca debe recomendar establecer el diseño como nulo, eso es simplemente incorrecto. – Michael

0

si ve la documentación de BorderLayout mainframe.add (jb); es igual a mainframe.add (jb, BorderLayout.CENTER); mainframe.add (enlace); es igual a mainframe.add (jb, BorderLayout.CENTER);

por lo que sólo muestran la última