我们如何在GridLayout中显示网格线?

Jes*_*ssy 17 java swing grid-layout

我们如何在GridLayout中显示网格线?在Java?

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"));
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*han 17

我会尝试通过在添加组件时为组件添加边框来实现.这样做的简单方法就是使用BorderFactory.createLineBorder(),如下所示:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,这将使您在单元格之间的边框比在面板边缘处更厚,因为外边缘将只有一个像素的粗边框,而内边缘将具有两个一个像素的粗边框.要解决此问题,您可以使用BorderFactory.createMatteBorder()仅在任何地方绘制一个像素宽的边框:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该为您提供宽度边界borderWidth,无论是在单元格之间还是在外边缘之间.

  • 不客气。顺便说一句,这是一个很好的问题示例 - 我能够将代码直接剪切并粘贴到 Eclipse 中并运行它,这使得测试我的解决方案变得非常容易。 (2认同)

Sau*_*kas 7

对于Joe Carnahan提到的粗边界问题,可以更容易地解决:GridLayout(10,10, -1, -1)将垂直间隙和组件之间的水平间隙设置为-1.所以完整的代码是:

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);
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*ger 6

我找到了一个非常简单的解决方案:

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

    };
Run Code Online (Sandbox Code Playgroud)

编辑:对于此解决方案,我只是重写了paint()JPanel 的方法,并按照GridBagLayout.getLayoutDimensions()手动在JPanel自己的图像上定义的方式绘制了网格。

  • @Ungeheuer 在这种情况下,插入代码是完全可以接受的。到处说一切“不可接受”是不可接受的。 (3认同)
  • 我添加了一个解释。 (2认同)