在JPanel中获得良好的网格布局

时间:2018-04-19 14:07:10

标签: java swing gridbaglayout

我正在开发一个项目,我在一个简单的软件中模拟(Conway的)Game Of Life。后端部分已经完成,但我有一些麻烦很好地显示单元格。我想要实现的是y行和x列(x和y可能因模拟而不同)。每个cel可以是活着的(某种颜色)或死的(另一种颜色),我希望它们是正方形或至少接近正方形。我还需要能够修改特定的单元格,例如第5行第3列的单元格可能需要变成不同的颜色,而不会影响其他单元格。

由于这些要求,我目前正在使用GridBagLayout,但我没有得到所需的结果。我面临两个问题:

  1. 我只能修改一行,而我可以修改我有多少列
  2. 我不知道如何制作每个单元格的正方形,它们有时会水平/垂直拉伸
  3. 我目前的代码,我正在鬼混,直到我得到正确的形状:

        //Set grid dimensions
        int gridSizeX = 5;
        int gridSizeY = 5;     
        JFrame f;
        JPanel p;    
    
        //Set the frame
        f = new JFrame("Window");
        f.setSize(600,400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
        //Set the panel
        p = new JPanel();
        p.setLayout(new GridBagLayout());
        p.setBackground(Color.blue);
    
        //Set the constraints
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 0.5;   
    
        //The panel that will hold the grid
        JPanel a;
    
        //Cycle through all fields of the grid and alternate between red and yellow fields
        for (int i = 0; i < gridSizeX; i++)
        {
            for (int j = 0; j < gridSizeY; j++)
            {
                a = new JPanel();
                if (i%2==0)
                    a.setBackground(Color.yellow);
                else
                    a.setBackground(Color.red);  
                c.gridx = i;
                c.gridy = j;
                p.add(a, c);
            }
        }
    
        //Make sure the frame and panel are shown
        f.add(p);
        f.setVisible(true);
    

2 个答案:

答案 0 :(得分:1)

您设置每个方块颜色的逻辑是错误的。你不能只做一个简单的&#34; i%2&#34;。这只适用于偶数行。你需要翻转奇数行的逻辑。

因此,您需要额外检查以确定正方形添加到哪一行。所以逻辑就像是:

for (int i = 0; i < 8; i++)
{
    for (int j = 0; j < 8; j++)
    {
        JPanel square = new JPanel( new BorderLayout() );
            square.setBackground( (i + j) % 2 == 0 ? Color.red : Color.white );
        chessBoard.add( square );
    }
}
  

我目前正在使用GridBagLayout

只需使用GridLayout即可。无需担心约束。

答案 1 :(得分:1)

  1. 您获得的行数更多,但不同行的列的颜色相同。因此,你不会看到差异。使用(i+j)%2
  2. c.weightx = 0.5外,您还应设置c.weighty = 0.5