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

Java 在JPanel中获得良好的网格布局,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我正在做一个项目,我正在用一个简单的软件模拟(康威的)生活游戏。后端部分已经完成,但是我在很好地显示单元格时遇到了一些问题。我试图实现的是有y行和x列(每个模拟的x和y可能不同)。每个细胞可以是活的(某种颜色)或死的(另一种颜色),我希望它们是正方形或至少接近正方形。我还需要能够修改特定的单元格,例如第5行第3列的单元格可能需要变成不同的颜色,而不会影响其他单元格 由于这些要求,我目前正在使用GridBagLayout,但没有得到预期的结果。我面临两个问题: 我只得到一行,而我可以修改我有多少列

我正在做一个项目,我正在用一个简单的软件模拟(康威的)生活游戏。后端部分已经完成,但是我在很好地显示单元格时遇到了一些问题。我试图实现的是有y行和x列(每个模拟的x和y可能不同)。每个细胞可以是活的(某种颜色)或死的(另一种颜色),我希望它们是正方形或至少接近正方形。我还需要能够修改特定的单元格,例如第5行第3列的单元格可能需要变成不同的颜色,而不会影响其他单元格

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

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

        //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);
    
    //设置网格尺寸
    int gridSizeX=5;
    int gridSizeY=5;
    jf框架;
    JPanel p;
    //定格
    f=新JFrame(“窗口”);
    f、 设置大小(600400);
    f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //设置面板
    p=新的JPanel();
    p、 setLayout(新的GridBagLayout());
    p、 挫折背景(颜色:蓝色);
    //设置约束条件
    GridBagConstraints c=新的GridBagConstraints();
    c、 fill=GridBagConstraints.BOTH;
    c、 权重x=0.5;
    //将容纳网格的面板
    JPanel a;
    //在网格的所有字段中循环,并在红色和黄色字段之间交替
    对于(int i=0;i
    您设置每个方块颜色的逻辑是错误的。你不能只做一个简单的“i%2”。这只适用于偶数行。您需要翻转奇数行的逻辑

    因此,您需要进行额外的检查,以确定正方形要添加到哪一行。所以逻辑应该是这样的:

    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 );
        }
    }
    
    for(int i=0;i<8;i++)
    {
    对于(int j=0;j<8;j++)
    {
    JPanel square=newjpanel(newborderlayout());
    方形立根背景((i+j)%2==0?颜色。红色:颜色。白色);
    棋盘。加(正方形);
    }
    }
    
    我目前正在使用GridBagLayout


    只需使用
    网格布局
    。无需担心约束。

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

    因此,您需要进行额外的检查,以确定正方形要添加到哪一行。所以逻辑应该是这样的:

    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 );
        }
    }
    
    for(int i=0;i<8;i++)
    {
    对于(int j=0;j<8;j++)
    {
    JPanel square=newjpanel(newborderlayout());
    方形立根背景((i+j)%2==0?颜色。红色:颜色。白色);
    棋盘。加(正方形);
    }
    }
    
    我目前正在使用GridBagLayout

    只需使用
    网格布局
    。不需要担心约束

  • 您可以获得更多的行,但不同行的列的颜色相同。因此,你看不出有什么不同。使用
    (i+j)%2
  • 除了
    c.weightx=0.5
    之外,还应该设置
    c.weighty=0.5
  • 您可以获得更多的行,但不同行的列的颜色相同。因此,你看不出有什么不同。使用
    (i+j)%2
  • 除了
    c.weightx=0.5
    之外,还应该设置
    c.weighty=0.5

  • 好的,谢谢你回答我愚蠢的问题!我马上就去试试。另外,我喜欢你的编码方式。@Vallas,那你为什么不使用GridLayout呢。这是适合您需求的布局管理器。它比使用GridBagLayout更容易编码,效率也更高。当涉及到创建用户界面时,我是一个初学者,我正在自学。感觉更熟悉,因为可以使用GridBagLayout修改特定字段(x,y),就像我在二维数组中所使用的一样。@Vallas,你为什么认为不能使用GridBagLayout来修改呢。GridLayout的关键在于它基于行/列。当你使用GridBagLayout时,一行可以有5个组件,另一行可以有2个组件。我在Youtube上观看一个视频,视频中的人说用GridBagLayout是不可能的,我愚蠢到相信他(或者误解了他,因为我不是英语母语)。但这真的很高兴知道,谢谢!!好的,谢谢你回答我愚蠢的问题!我马上就去试试。另外,我喜欢你的编码方式。@Vallas,那你为什么不使用GridLayout呢。这是适合您需求的布局管理器。它比使用GridBagLayout更容易编码,效率也更高。当涉及到创建用户界面时,我是一个初学者,我正在自学。感觉更熟悉,因为可以使用GridBagLayout修改特定字段(x,y),就像我在二维数组中所使用的一样。@Vallas,你为什么认为不能使用GridBagLayout来修改呢。GridLayout的关键在于它基于行/列。当你使用GridBagLayout时,一行可以有5个组件,另一行可以有2个组件。我在Youtube上观看一个视频,视频中的人说用GridBagLayout是不可能的,我愚蠢到相信他(或者误解了他,因为我不是英语母语)。但那是真的