在获得位置之前打包框架。似乎一切都从原点(0,0)开始相互重叠,直到你打包。
这是一个工作代码:
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestBoxLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panelHolder = new JPanel();
panelHolder.setLayout(new BoxLayout(panelHolder, BoxLayout.Y_AXIS));
for (int i = 0; i < 10; i++) {
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(100, 13)); //I set the height just to make sure.
panelHolder.add(p);
}
frame.add(panelHolder);
/**
* Pack before you get the position.
*/
frame.pack();
int componentCount = panelHolder.getComponentCount();
for (int j = 0; j < componentCount; j++) {
Component c = panelHolder.getComponent(j);
JPanel p = (JPanel) c;
System.out.println(p.getY());//I get 0, 13, 26, 39, .....
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
结果:
0
13
26
39
52
65
78
91
104
117
注意:BoxLayout 的签名是BoxLayout(Container target, int axis)
. 这target
是您将布局设置为的内容。出于这个原因,如果你想使用 BoxLayout,你应该总是先创建面板。然后使用component.setLayout()
,使目标已经存在。您的this
JPanel 构造函数中的 是指其他东西,而不是panelHolder
. 我猜你创建这个函数的类也是它的子类,Container
这就是你没有得到错误的原因。