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
对象,但遗憾的是我的输出如下面的屏幕截图所示:
最后一次迭代中的帧似乎在一个位置呈现,好像i和j比初始值低1个单位。任何想法?
答案 0 :(得分:6)
使用GridLayout代替setBounds()
,根本不要使用NullLayout
frame.add(panels[i][j]);
应该是循环中的最后一个代码行
System.out.println(panels[i][j].getBounds());
在屏幕上调用JFrame.pack()
或JFrame
已经visible
后返回合理的坐标
更快地发布SSCCE / MCVE,简短,可运行,可编辑
答案 1 :(得分:0)
这是因为JFrame
默认布局不是null
。这是BorderLayout
。
如果您真的想设置界限,请制作JFrame
布局null
。
frame.setLayout(null);
**虽然可以不使用布局管理器,但是如果可能的话,应该使用布局管理器。布局管理器可以更轻松地调整依赖于外观的组件外观,不同的字体大小,容器的大小变化以及不同的区域设置。布局管理器也可以被其他容器以及其他程序轻松地重用。
虽然,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);