2010-03-14 13 views
16

Come mostriamo la griglia in GridLayout? in Java?Come mostriamo la griglia in 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")); 
} 

risposta

14

Proverei a farlo aggiungendo bordi ai componenti man mano che vengono aggiunti. Il modo più semplice per farlo è solo utilizzando BorderFactory.createLineBorder(), come questo:

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

tuttavia, che vi darà più spessi confini tra le cellule rispetto ai bordi del pannello, in quanto i bordi esterni avranno solo un one bordo spesso di pixel e i bordi interni avranno due bordi spessi di un pixel insieme. Per ovviare a questo, si può utilizzare BorderFactory.createMatteBorder() per disegnare soltanto confini a livello di un pixel in tutto il mondo:

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

Questo dovrebbe dare confini della larghezza borderWidth ovunque, sia tra le cellule e lungo i bordi esterni.

+0

Grazie a te Joe ... :-) – Jessy

+1

Prego. Un buon esempio di domanda, a proposito: sono stato in grado di tagliare e incollare il codice direttamente in Eclipse ed eseguirlo, il che ha reso molto semplice testare la mia soluzione. –

+0

ha tentato di farlo comparire, ma quando l'ho eseguito, JFrame era vuoto, niente lo – Ungeheuer

0

sarei tentato di utilizzare JLayeredPane per posizionare un componente non opaco sopra la parte superiore che disegna linee basate sulla griglia.

+0

potresti aggiungere del codice a questa risposta per mostrare come funzionerebbe? – Ungeheuer

0

O semplicemente impostare il colore di sfondo del pannello per essere il vostro colore del bordo e la griglia apparirà come per 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

C'è un lavoro più facile intorno al problema delle frontiere spessa menzionato da Joe Carnahan: GridLayout(10,10, -1, -1) imposta gli spazi verticali e gli spazi orizzontali tra i componenti su -1. Quindi il codice completo è:

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

Aggiungi commento, le risposte solo in codice sono disapprovate. –

4

ho trovato una soluzione molto semplice:

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: Per questa soluzione ho semplicemente ridefinire il metodo del JPanel paint() e dipingere la griglia, come definito per GridBagLayout.getLayoutDimensions() manualmente sopra l'immagine di JPanel.

+1

e cosa fa? ci dovrebbe sempre essere una spiegazione di come la risposta funziona insieme alla risposta che fornisci. Il drop in *** *** *** non è accettabile – Ungeheuer

+0

Ho aggiunto una spiegazione. –

Problemi correlati