2011-07-30 10 views
5

No puedo hacer que BorderLayout funcione. Quiero que el botón de cancelar se coloque en la parte inferior, pero no funciona. Código:BorderLayout no funciona

import java.awt.BorderLayout; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ButtonModel; 
import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 

class Test { 
    public static JFrame owner; 
    public static void main(String[] args) { 
     final JDialog frame = new JDialog(owner, "Test"); 
     frame.setLayout(new BorderLayout()); 
     frame.setSize(500, 300); 
     final JPanel panel = new JPanel(); 
     final ButtonGroup group = new ButtonGroup(); 
     String[] options = {"1", "2", "3"}; 
     for (String text : options) { 
      JRadioButton option = new JRadioButton(text); 
      option.setActionCommand(text); 
      group.add(option); 
      panel.add(option); 
     } 
     JButton okButton = new JButton("OK"); 
     okButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       ButtonModel selectedModel = group.getSelection(); 
       if (selectedModel != null) { 
        System.err.println(selectedModel.getActionCommand()); 
       } 
      } 
     }); 
     panel.add(okButton); 
     JButton cancelButton = new JButton("Cancel"); 
     cancelButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.setVisible(false); 
       frame.dispose(); 
      } 
     }); 
     panel.add(cancelButton, BorderLayout.SOUTH); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

Respuesta

6

se puede tratar de cambiar

panel.add(cancelButton, BorderLayout.SOUTH); 

a

frame.add(cancelButton, BorderLayout.SOUTH); 

Resultado:

enter image description here

+0

@Tyilo: esta es una respuesta válida, 1+. Si esto no cumple con sus requisitos, entonces debe publicar una imagen de lo que quiere que tenga la GUI como lo hizo user802421. –

+0

Me encanta la captura de pantalla! Para obtener algunos consejos sobre cómo crear uno aún mejor, consulte [¿Cómo creo una captura de pantalla para ilustrar una publicación?] (Http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot -to-illustrate-a-post). –

8

Se agrega CancelButton al panel utilizando la constante BorderLayout.SOUTH:

panel.add(cancelButton, BorderLayout.SOUTH); 

¿Pero donde se define la disposición de panel que se BorderLayout? Como nunca configuras el diseño de este contenedor, usará el diseño predeterminado para JPanel, que es FlowLayout.

Solución: configure el diseño del panel JPanel en BorderLayout para obtener el comportamiento BorderLayout.

Una vez que soluciona este, tendrá otro problema sin embargo:

for (String text : options) { 
    JRadioButton option = new JRadioButton(text); 
    option.setActionCommand(text); 
    group.add(option); 
    panel.add(option); 
    } 

Has añadido JRadioButton de los mismos JPanel del panel sin tener en cuenta el diseño. Sospecho que desea agregar los JRadioButtons a su propio JPanel, probablemente uno que usa GridLayout(1, 0) o GridLayout(0, 1), dependiendo de la orientación deseada, y luego que desea agregar este JPanel al panel, quizás en la posición BorderLayout.CENTER.

También tiene un problema similar con su okButton en que lo agrega al panel sin importar el diseño.

+0

te ganaron, no quisiste robar nada;) – Jack

+0

@jack: Gracias, pero no estás "robando" nada. y lo mismo con el voto positivo. ;) –

3

Como dice Hovercraft completa de anguilas, JPanel comportamiento por defecto es el FlowLayout, que es la más simple, y es descrito here. Usted puede cambiar fácilmente a la gerente que necesita mediante la especificación de que dentro del constructor:

panel = new JPanel(new BorderLayout()) 
+0

-1, dado que Hovercraft ya menciona FlowLayout es el valor predeterminado, no hay necesidad de una respuesta duplicada. Si desea enfatizar este punto, puede hacer un comentario en su respuesta. – camickr

+0

En realidad, él no dijo eso, lo agregó como una edición. ¿Debería ser precog? :) – Jack

+0

¿Qué? Usted comienza su anwer con "As Hovercraft dice ...", por lo que el comentario obviamente estaba allí, si necesita más confirmación, haga clic en el enlace al lado de la etiqueta "editado" y vaya al final donde encontrará la publicación original que NO se modificó con respecto al comentario de FlowLayout – camickr