2010-03-14 49 views

Trả lời

14

Tôi sẽ cố gắng làm điều đó bằng cách thêm đường viền cho các thành phần khi chúng được thêm vào. Cách đơn giản để làm điều đó chỉ được sử dụng BorderFactory.createLineBorder(), như thế này:

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

Tuy nhiên, đó sẽ cung cấp cho bạn giáp dày hơn giữa các tế bào hơn ở các cạnh của bảng điều khiển, bởi vì các cạnh bên ngoài sẽ chỉ có một one- đường viền dày của pixel và các cạnh bên trong sẽ có hai đường viền dày một pixel với nhau. Để làm việc xung quanh đó, bạn có thể sử dụng BorderFactory.createMatteBorder() để chỉ vẽ đường biên giới một pixel rộng ở khắp mọi nơi:

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

này sẽ cho bạn biên giới rộng borderWidth ở khắp mọi nơi, cả giữa các tế bào và dọc theo các cạnh bên ngoài.

+0

Cảm ơn bạn Joe ... :-) – Jessy

+1

Bạn được chào đón. Ví dụ tốt về một câu hỏi, bằng cách này - tôi đã có thể cắt và dán mã của bạn trực tiếp vào Eclipse và chạy nó, điều này làm cho nó rất dễ dàng để kiểm tra giải pháp của tôi. –

+0

đã cố gắng để có được điều này để bật lên, nhưng khi tôi chạy nó JFrame đã được sản phẩm nào, không có gì có – Ungeheuer

0

Tôi sẽ bị cám dỗ sử dụng JLayeredPane để đặt thành phần không mờ trên đầu vẽ đường dựa trên lưới.

+0

bạn có thể thêm một số mã vào câu trả lời này để cho biết cách hoạt động của mã đó không? – Ungeheuer

0

Hoặc chỉ cần thiết lập màu nền của bảng điều khiển là màu biên giới của bạn và gridlines sẽ xuất hiện như ma thuật:

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ó một công việc dễ dàng hơn xung quanh để các vấn đề biên giới dày được đề cập bởi Joe Carnahan: GridLayout(10,10, -1, -1) đặt khoảng trống theo chiều dọc và khoảng trống ngang giữa các thành phần thành -1. Vì vậy, các mã đầy đủ là:

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

Vui lòng thêm nhận xét, câu trả lời chỉ mã được cau mày. –

4

Tôi tìm thấy một giải pháp rất đơn giản:

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: Đối với giải pháp này tôi chỉ cần ghi đè phương pháp paint() của JPanel và sơn lưới điện theo quy định bởi GridBagLayout.getLayoutDimensions() theo cách thủ công trên đầu hình ảnh của chính JPanel.

+1

và điều này làm gì? phải luôn có giải thích về cách câu trả lời hoạt động cùng với câu trả lời bạn cung cấp. Chỉ có *** mã *** không được chấp nhận – Ungeheuer

+0

Tôi đã thêm giải thích. –

Các vấn đề liên quan