1

下面的代码生成九个单独的 JPanel,其中有 9 个按钮。九个 JPanel 使用 GridLayout 排列到一个基本 JPanel 上。然后使用 Border Layout 将此基本 JPanel 放置到 ContentPane 上。我为 JButtons 和每个单独的 JPanel 使用边框来清楚地定义它们的分隔。每个 JPanel 内的 JButton 看起来都不错,但 JPanel 之间存在间隙,这导致出现双线,这让我很烦。我尝试将每个单独的 JPanel 直接添加到 ContentPane 上,但这没有任何作用。完全被难住了,想知道是否有人有任何建议?

PS 我知道大量重复代码需要以一种糟糕的方式重新分解,它会的,这只是为了模拟目的。

谢谢,

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

public class View1 extends JFrame
{
    private JPanel      basePanel;
    private JPanel      childPanel1;
    private JPanel      childPanel2;
    private JPanel      childPanel3;
    private JPanel      childPanel4;
    private JPanel      childPanel5;
    private JPanel      childPanel6;
    private JPanel      childPanel7;
    private JPanel      childPanel8;
    private JPanel      childPanel9;
    private int         row = 3;
    private int         column = 3;
    private JButton[][] squares1;
    private JButton[][] squares2;
    private JButton[][] squares3;
    private JButton[][] squares4;
    private JButton[][] squares5;
    private JButton[][] squares6;
    private JButton[][] squares7;
    private JButton[][] squares8;
    private JButton[][] squares9;
    private Font        numberFont;

public View1()
{
    setSize(400,400);
    setTitle("2013");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    basePanel  = new JPanel();
    basePanel.setLayout(new GridLayout(row, column, 0, 0));
    numberFont = new Font("sansserif", Font.BOLD, 32);

    childPanel1Setup();
    childPanel2Setup();
    childPanel3Setup();
    childPanel4Setup();
    childPanel5Setup();
    childPanel6Setup();
    childPanel7Setup();
    childPanel8Setup();
    childPanel9Setup();

    basePanel.add(childPanel1);
    basePanel.add(childPanel2);
    basePanel.add(childPanel3);
    basePanel.add(childPanel4);
    basePanel.add(childPanel5);
    basePanel.add(childPanel6);
    basePanel.add(childPanel7);
    basePanel.add(childPanel8);
    basePanel.add(childPanel9);

    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
    cp.add(basePanel, BorderLayout.CENTER);
}

public void childPanel1Setup()
{
    childPanel1 = new JPanel();
    childPanel1.setLayout(new GridLayout(row, column, 0, 0));
    childPanel1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares1 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares1[rows][cols] = new JButton();
            squares1[rows][cols].setSize(32, 32);
            squares1[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares1[rows][cols].setBackground(Color.WHITE);
            childPanel1.add(squares1[rows][cols]);
        }
    }
}

public void childPanel2Setup()
{
    childPanel2 = new JPanel();
    childPanel2.setLayout(new GridLayout(row, column, 0, 0));
    childPanel2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares2 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares2[rows][cols] = new JButton();
            squares2[rows][cols].setSize(32, 32);
            squares2[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares2[rows][cols].setBackground(Color.WHITE);
            childPanel2.add(squares2[rows][cols]);
        }
    }
}

public void childPanel3Setup()
{
    childPanel3 = new JPanel();
    childPanel3.setLayout(new GridLayout(row, column, 0, 0));
    childPanel3.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares3 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares3[rows][cols] = new JButton();
            squares3[rows][cols].setSize(32, 32);
            squares3[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares3[rows][cols].setBackground(Color.WHITE);
            childPanel3.add(squares3[rows][cols]);
        }
    }
}

public void childPanel4Setup()
{
    childPanel4 = new JPanel();
    childPanel4.setLayout(new GridLayout(row, column, 0, 0));
    childPanel4.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares4 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares4[rows][cols] = new JButton();
            squares4[rows][cols].setSize(32, 32);
            squares4[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares4[rows][cols].setBackground(Color.WHITE);
            childPanel4.add(squares4[rows][cols]);
        }
    }
}

public void childPanel5Setup()
{
    childPanel5 = new JPanel();
    childPanel5.setLayout(new GridLayout(row, column, 0, 0));
    childPanel5.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares5 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares5[rows][cols] = new JButton();
            squares5[rows][cols].setSize(32, 32);
            squares5[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares5[rows][cols].setBackground(Color.WHITE);
            childPanel5.add(squares5[rows][cols]);
        }
    }
}

public void childPanel6Setup()
{
    childPanel6 = new JPanel();
    childPanel6.setLayout(new GridLayout(row, column, 0, 0));
    childPanel6.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares6 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares6[rows][cols] = new JButton();
            squares6[rows][cols].setSize(32, 32);
            squares6[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares6[rows][cols].setBackground(Color.WHITE);
            childPanel6.add(squares6[rows][cols]);
        }
    }
}

public void childPanel7Setup()
{
    childPanel7 = new JPanel();
    childPanel7.setLayout(new GridLayout(row, column, 0, 0));
    childPanel7.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares7 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares7[rows][cols] = new JButton();
            squares7[rows][cols].setSize(32, 32);
            squares7[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares7[rows][cols].setBackground(Color.WHITE);
            childPanel7.add(squares7[rows][cols]);
        }
    }
}

public void childPanel8Setup()
{
    childPanel8 = new JPanel();
    childPanel8.setLayout(new GridLayout(row, column, 0, 0));
    childPanel8.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares8 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares8[rows][cols] = new JButton();
            squares8[rows][cols].setSize(32, 32);
            squares8[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares8[rows][cols].setBackground(Color.WHITE);
            childPanel8.add(squares8[rows][cols]);
        }
    }
}

public void childPanel9Setup()
{
    childPanel9 = new JPanel();
    childPanel9.setLayout(new GridLayout(row, column, 0, 0));
    childPanel9.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    squares9 = new JButton[row][column];

    for(int rows = 0; rows < this.row; rows++)
    {
        for(int cols = 0; cols < this.column; cols++)
        {
            squares9[rows][cols] = new JButton();
            squares9[rows][cols].setSize(32, 32);
            squares9[rows][cols].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            squares9[rows][cols].setBackground(Color.WHITE);
            childPanel9.add(squares9[rows][cols]);
        }
    }
}

}

4

2 回答 2

4

我相信这是因为JPanels的布局管理器FlowLayout包含边距。创建面板时,将它们的布局设置为 GridLayout,这将为您提供 0 边距。

setVgap(0);你也做过setHgap(0);GridLayout

于 2013-02-04T18:18:09.370 回答
1

GridLayout 使所有组件具有相同的大小。如果它需要在 JPanel 内部布局 3x3 组件的矩阵,它是 100x100 像素,每个组件将是 33x33 像素,并且在右侧和底部会有额外的像素,因为 100 不是 3 的因数。如果 JPanel 是 101x101 像素,所有四个边缘都会有额外的像素。

考虑使用 GridBagLayout 或 Box 或其他比 GridLayout 更智能的布局。

于 2013-02-04T18:16:10.997 回答