2010-03-29 25 views
23

Pongo mis botones en un JPane con GridLayout. Luego puse JPanel en otro JPanel con BoxLayout.Y_AXIS. Quiero que los botones en el GridLayout sean cuadrados. Yo uso tmp.setSize (30,30) y no funciona. También trato de usar new GridLayout(X, Y, 4, 4) pero no puedo entender qué son X e Y. Entonces, ¿cuál es la forma correcta de hacer esto?¿Cómo puedo establecer el tamaño de un botón?

añadido:

Todavía no puedo resolver el problema. Aquí está el código de lo que estoy tratando de hacer:

import javax.swing.*; 
import java.awt.*; 

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

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

     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(4, 4)); 
     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(100, 100)); 
       firstPanel.add(btn); 
      } 
     } 

     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(5, 13)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(40, 40)); 
       secondPanel.add(btn); 
      } 
     } 

     mainPanel.add(firstPanel); 
     mainPanel.add(secondPanel); 
     frame.add(mainPanel); 

     frame.setSize(400,600); 
     frame.setVisible(true); 
    } 
} 

El problema es que Java trata de hacer que la anchura de la firstPanel y secondPanel iguales! Además, Java intenta llenar toda la altura de la ventana. ¿Cómo puedo eliminar este comportamiento?

Respuesta

28

El siguiente fragmento de código hace lo que usted solicita. Sólo asegúrese de que asigna suficiente espacio para que el texto en el botón se hace visible

JFrame frame = new JFrame("test"); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
JPanel panel = new JPanel(new GridLayout(4,4,4,4)); 

for(int i=0 ; i<16 ; i++){ 
    JButton btn = new JButton(String.valueOf(i)); 
    btn.setPreferredSize(new Dimension(40, 40)); 
    panel.add(btn); 
} 
frame.setContentPane(panel); 
frame.pack(); 
frame.setVisible(true); 

El X e Y (dos primeros parámetros del constructor de GridLayout) especificar el número de filas y columnas de la cuadrícula (respectivamente) . Puede dejar uno de ellos como 0 si desea que ese valor no tenga límites.

Editar

He modificado el código provisto y creo que ahora se ajusta a lo que se desea:

JFrame frame = new JFrame("Colored Trails"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

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

JPanel firstPanel = new JPanel(); 
firstPanel.setLayout(new GridLayout(4, 4)); 
firstPanel.setMaximumSize(new Dimension(400, 400)); 
JButton btn; 
for (int i=1; i<=4; i++) { 
    for (int j=1; j<=4; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(100, 100)); 
     firstPanel.add(btn); 
    } 
} 

JPanel secondPanel = new JPanel(); 
secondPanel.setLayout(new GridLayout(5, 13)); 
secondPanel.setMaximumSize(new Dimension(520, 200)); 
for (int i=1; i<=5; i++) { 
    for (int j=1; j<=13; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(40, 40)); 
     secondPanel.add(btn); 
    } 
} 

mainPanel.add(firstPanel); 
mainPanel.add(secondPanel); 
frame.setContentPane(mainPanel); 

frame.setSize(520,600); 
frame.setMinimumSize(new Dimension(520,600)); 
frame.setVisible(true); 

Básicamente ahora establecer el tamaño preferido de los paneles y un tamaño mínimo para el marco

+0

Probé este código. Funciona. Pero si trato de implementar la misma idea en mi programa, no funciona. Creo que la razón es que incluyo mi JPanel (con GridLayout) en otro JPanel (con BoxLayout.Y_AXIS). – Roman

+0

@Roman Si desea ayuda más específica, deberá publicar un código de muestra. – Kris

+0

según lo solicitado, publiqué el código. – Roman

5

Probar con setPreferredSize en lugar de setSize.

UPDATE:GridLayout ocupar todo el espacio en su recipiente, y BoxLayout costuras para ocupar todo el ancho en su envase, lo que añade un poco de pegamento-paneles que son invisibles y sólo ocupan espacio cuando el usuario estira la ventana. Acabo de hacer esto horizontalmente, y no verticalmente, pero podría implementarlo de la misma manera si lo desea.

Como todas las celdas tienen el mismo tamaño, no importa si tienen un tamaño específico. En su lugar, debe especificar un tamaño para su contenedor, como lo he hecho.

import javax.swing.*; 
import java.awt.*; 

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

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

     JPanel firstPanel = new JPanel(new GridLayout(4, 4)); 
     firstPanel.setPreferredSize(new Dimension(4*100, 4*100)); 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       firstPanel.add(new JButton()); 
      } 
     } 

     JPanel firstGluePanel = new JPanel(new BorderLayout()); 
     firstGluePanel.add(firstPanel, BorderLayout.WEST); 
     firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     JPanel secondPanel = new JPanel(new GridLayout(13, 5)); 
     secondPanel.setPreferredSize(new Dimension(5*40, 13*40)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       secondPanel.add(new JButton()); 
      } 
     } 

     JPanel secondGluePanel = new JPanel(new BorderLayout()); 
     secondGluePanel.add(secondPanel, BorderLayout.WEST); 
     secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     mainPanel.add(firstGluePanel); 
     mainPanel.add(secondGluePanel); 
     frame.getContentPane().add(mainPanel); 

     //frame.setSize(400,600); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

El compilador escribe que no puede encontrar el método denominado 'setPreferredSize'. – Roman

2

GridLayout a menudo no es la mejor opción para los botones, aunque podría ser para su aplicación. Una buena referencia es tutorial on using Layout Managers. Si miras el ejemplo de GridLayout, verás que los botones se ven un poco tontos, demasiado grandes.

Una mejor idea podría ser utilizar FlowLayout para sus botones, o si sabe exactamente lo que desea, quizás un GroupLayout. (Sun/Oracle recommend que el diseño de GroupLayout o GridBag es mejor que GridLayout cuando se codifica manualmente.)

Cuestiones relacionadas