包越來越位置之前的框架。從原點(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()
以便目標已經存在。您的JPanel構造函數中的this
指的是其他內容,而不是panelHolder
。我猜你創建這個函數的類也是Container
的子類,這就是爲什麼你沒有得到一個錯誤。
嘗試檢查_after_ 'validate()'或'pack()';另外,編輯你的問題,包括一個[sscce](http://sscce.org/),它們顯示你的方法。 – trashgod