2010-03-14 8 views
16

¿Cómo mostramos la cuadrícula en GridLayout? en Java?¿Cómo mostramos la cuadrícula en GridLayout?

JPanel panel = new JPanel(new GridLayout(10,10)); 
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2)); 

for (int i =0; i<(10*10); i++){ 
    panel.add(new JLabel("Label")); 
} 

Respuesta

14

Intentaré hacerlo agregando bordes a los componentes a medida que se agregan. La forma más sencilla de hacerlo es sólo con BorderFactory.createLineBorder(), así:

JPanel panel = new JPanel(new GridLayout(10,10)); 
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2)); 

for (int i =0; i<(10*10); i++){ 
    final JLabel label = new JLabel("Label"); 
    label.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    panel.add(label); 
} 

Sin embargo, que le dará más gruesas fronteras entre las células que en los bordes del panel, ya que los bordes exteriores sólo tendrán un uno un borde de un grosor de píxel y los bordes interiores tendrán dos bordes gruesos de un píxel juntos. Para evitar eso, se puede utilizar BorderFactory.createMatteBorder() sólo para dibujar las fronteras de un píxel de ancho en todas partes:

final int borderWidth = 1; 
final int rows = 10; 
final int cols = 10; 
JPanel panel = new JPanel(new GridLayout(rows, cols)); 
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2)); 

for (int row = 0; row < rows; row++) { 
    for (int col = 0; col < cols; col++) { 
     final JLabel label = new JLabel("Label"); 
     if (row == 0) { 
      if (col == 0) { 
       // Top left corner, draw all sides 
       label.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
      } 
      else { 
       // Top edge, draw all sides except left edge 
       label.setBorder(BorderFactory.createMatteBorder(borderWidth, 
                   0, 
                   borderWidth, 
                   borderWidth, 
                   Color.BLACK)); 
      } 
     } 
     else { 
      if (col == 0) { 
       // Left-hand edge, draw all sides except top 
       label.setBorder(BorderFactory.createMatteBorder(0, 
                   borderWidth, 
                   borderWidth, 
                   borderWidth, 
                   Color.BLACK)); 
      } 
      else { 
       // Neither top edge nor left edge, skip both top and left lines 
       label.setBorder(BorderFactory.createMatteBorder(0, 
                   0, 
                   borderWidth, 
                   borderWidth, 
                   Color.BLACK)); 
      } 
     } 
     panel.add(label); 
    } 
} 

Esto debe darle fronteras de ancho borderWidth todas partes, tanto entre las células ya lo largo de los bordes exteriores.

+0

Gracias a ti Joe ... :-) – Jessy

+1

De nada. Buen ejemplo de una pregunta, por cierto, pude cortar y pegar el código directamente en Eclipse y ejecutarlo, lo que hizo que probar mi solución fuera muy fácil. –

+0

intenté hacer que apareciera, pero cuando lo ejecuté el JFrame estaba vacío, nada allí – Ungeheuer

0

estaría tentado a usar JLayeredPane para colocar un componente no opaca sobre la parte superior que dibuja líneas basadas en la parrilla.

+0

¿podría agregar algún código a esta respuesta para mostrar cómo funcionaría? – Ungeheuer

0

O simplemente establecer el color de fondo del panel para que sea su color de borde y las líneas de cuadrícula aparecerá como magia:

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

public class GridLayoutLines extends JFrame 
{ 
    public GridLayoutLines() 
    { 
     JPanel grid = new JPanel(new GridLayout(10, 10, 2, 2)); 
     grid.setBackground(Color.BLACK); 
     grid.setBorder(new MatteBorder(2, 2, 2, 2, Color.BLACK)); 

     for (int i = 0; i < 100; i++) 
     { 
      JLabel label = new JLabel(); 
      label.setText(" label" + i); 
      label.setOpaque(true); 
      grid.add(label); 
     } 

     add(grid); 
    } 

    public static void main(String[] args) 
    { 
     GridLayoutLines frame = new GridLayoutLines(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
7

Hay un trabajo más fácil en torno al problema de las fronteras de espesor mencionado por Joe Carnahan: GridLayout(10,10, -1, -1) establece los huecos verticales y los huecos horizontales entre componentes en -1. Por lo que el código completo es:

JPanel panel = new JPanel(new GridLayout(10,10, -1, -1)); 
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2)); 

for (int i =0; i<(10*10); i++){ 
    final JLabel label = new JLabel("Label"); 
    label.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    panel.add(label); 
} 
-1
//http://www.geekssay.com/how-to-make-grid-layout-using-swing/ 

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

class GridExample { 

 private JFrame f; 

 private JButton b1, b2, b3, b4, b5, b6; 

  
public GridExample() { 

 f = new JFrame("Grid Example"); 

 b1 = new JButton("Button 1"); 

 b2 = new JButton("Button 2"); 

 b3 = new JButton("Button 3"); 

 b4 = new JButton("Button 4"); 
 b5 = new JButton("Button 5"); 
 b6 = new JButton("Button 6"); 
 } 
  
public void launchFrame() { 
 f.setLayout (new GridLayout(3,2)); 
  
f.add(b1); 

 f.add(b2); 

 f.add(b3); 
 f.add(b4); 

 f.add(b5); 
 f.add(b6); 

  
f.pack(); 
 f.setVisible(true); 

 } 
  
public static void main(String args[]) { 

 GridExample grid = new GridExample(); 
 grid.launchFrame(); 
 } 
} 
+0

Agregue un comentario, las respuestas de solo código son desaprobadas. –

4

he encontrado una solución muy simple:

final GridBagLayout layout = new GridBagLayout(); 
    JPanel content = new JPanel(layout) 
    { 

     @Override 
     public void paint(Graphics g) 
     { 
      super.paint(g); 
      int[][] dims = layout.getLayoutDimensions(); 
      g.setColor(Color.BLUE); 
      int x = 0; 
      for (int add : dims[0]) 
      { 
       x += add; 
       g.drawLine(x, 0, x, getHeight()); 
      } 
      int y = 0; 
      for (int add : dims[1]) 
      { 
       y += add; 
       g.drawLine(0, y, getWidth(), y); 
      } 
     } 

    }; 

EDIT: Para esta solución simplemente reemplazar el método de la JPanel paint() y pintar la rejilla como se define por GridBagLayout.getLayoutDimensions() manualmente sobre la propia imagen de JPanel.

+1

y ¿qué hace esto? siempre debe haber una explicación de cómo funciona la respuesta junto con la respuesta que proporciona. Dejar caer en *** solo código *** no es aceptable – Ungeheuer

+0

Agregué una explicación. –

Cuestiones relacionadas