Swing没有正确渲染我的JPanel

时间:2014-12-23 11:31:42

标签: java swing loops jpanel rendering

public void renderPanels(){
    for(int i = 1; i<4; i++){
        for(int j = 1; j<4; j++){
            panels[i][j] = new JPanel();
            frame.add(panels[i][j]);

            buttons[i][j] = new JButton();
            panels[i][j].add(buttons[i][j]);

            panels[i][j].setBounds(i*50, j*50, 50, 50);

            panels[i][j].setLayout(null);

            buttons[i][j].setBounds(0, 0, 50, 50);

            System.out.println(panels[i][j].getBounds());
        }
    }
}

好的,这是我的代码,用于渲染一个带有按钮的3x3面板网格。 frame变量包含一个JFrame对象,但遗憾的是我的输出如下面的屏幕截图所示:

Screenshot

最后一次迭代中的帧似乎在一个位置呈现,好像i和j比初始值低1个单位。任何想法?

2 个答案:

答案 0 :(得分:6)

  1. 使用GridLayout代替setBounds(),根本不要使用NullLayout

  2. frame.add(panels[i][j]);应该是循环中的最后一个代码行

  3. System.out.println(panels[i][j].getBounds());在屏幕上调用JFrame.pack()JFrame已经visible后返回合理的坐标

  4. 更快地发布SSCCE / MCVE,简短,可运行,可编辑

答案 1 :(得分:0)

这是因为JFrame默认布局不是null。这是BorderLayout。 如果您真的想设置界限,请制作JFrame布局null

frame.setLayout(null);

**虽然可以不使用布局管理器,但是如果可能的话,应该使用布局管理器。布局管理器可以更轻松地调整依赖于外观的组件外观,不同的字体大小,容器的大小变化以及不同的区域设置。布局管理器也可以被其他容器以及其他程序轻松地重用。

虽然,GridLayout是要走的路。 这里有些事情你可能需要考虑。

Absolute Positioning

How to use GridLayout

以下是GridLayout

的一些基础知识
  JPanel m = new JPanel();

        GridLayout gridLayout = new GridLayout(3, 3,0,0);
        m.setLayout( gridLayout);
        for (int i = 0; i < gridLayout.getRows(); i++) {
            for (int ii = 0; ii < gridLayout.getColumns(); ii++) {
                JPanel p = new JPanel();
                p.add(new JButton("X"));
                m.add(p, i, ii);
            }

        }
        frame.add(m);