2010-03-14 6 views
16

Wie zeigen wir die Rasterlinie in GridLayout? in Java?Wie zeigen wir die Gitterlinie 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")); 
} 

Antwort

14

Ich würde versuchen, es durch Hinzufügen von Rahmen zu den Komponenten, wie sie hinzugefügt werden. Der einfache Weg, es zu tun, ist mit nur BorderFactory.createLineBorder(), wie folgt aus:

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

jedoch, dass Sie dicker Grenzen zwischen den Zellen geben, als an den Kanten der Platte, weil die äußeren Kanten nur eine ein- haben pixel-dicker Rahmen und die inneren Ränder haben zwei ein Pixel dicke Ränder. Zum Umgehen das, können Sie BorderFactory.createMatteBorder() verwenden nur ein Pixel breiten Grenzen überall zu zeichnen:

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

Dies sollte Ihnen Grenzen Breite borderWidth überall, sowohl zwischen den Zellen und entlang den Außenkanten.

+0

Danke dir Joe ... :-) – Jessy

+1

Gern geschehen. Ein gutes Beispiel für eine Frage: Ich konnte Code direkt in Eclipse kopieren und ausführen, was es sehr einfach machte, meine Lösung zu testen. –

+0

versucht, dies zu Pop-up, aber wenn ich es lief der JFrame leer war, nichts – Ungeheuer

0

würde ich versucht sein JLayeredPane zu verwenden, um eine nicht-opaque Komponente über der Oberseite anzuordnen, die Linien auf der Basis des Gitter zieht.

+0

Könnten Sie dieser Antwort Code hinzufügen, um zu zeigen, wie das funktioniert? – Ungeheuer

0

Oder einfach nur die Hintergrundfarbe des Panels stellen Sie Ihre Rahmenfarbe und die Rasterlinien wie Magie erscheinen zu sein:

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

Es gibt eine einfachere Arbeit um das dicken Grenzen Problem von Joe Carnahan erwähnt: GridLayout(10,10, -1, -1) legt die vertikalen Lücken und die horizontalen Lücken zwischen den Komponenten auf -1 fest. So ist der vollständige Code ist:

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

Bitte Kommentar hinzufügen, Code-only-Antworten sind verpönt. –

4

Ich habe eine sehr einfache Lösung gefunden:

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: Für diese Lösung i einfach überschreiben die paint() Methode des JPanel und malen das Raster definiert von GridBagLayout.getLayoutDimensions() manuell über das eigene Bild des JPanel.

+1

und was macht das? Es sollte immer eine Erklärung geben, wie die Antwort zusammen mit der Antwort funktioniert, die Sie zur Verfügung stellen. Das Einwerfen von *** nur *** Code ist nicht akzeptabel – Ungeheuer

+0

Ich habe eine Erklärung hinzugefügt. –

Verwandte Themen