我想我解决了我的问题,但我不知道为什么会这样,所以我希望有人能向我解释一下,这样我以后就不会再犯同样的错误了。
这是一个简单的示例,可以编译我正在尝试做的事情:
public class BoxLayoutTest extends JFrame
{
public BoxLayoutTest()
{
setSize(400,300);
JPanel mainPanel = new JPanel(new FlowLayout());
setContentPane(mainPanel);
JPanel subPanel = new JPanel();
subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.PAGE_AXIS));
subPanel.setBackground(Color.BLUE);
JLabel labelTest = new JLabel("This is a test");
subPanel.add(labelTest);
labelTest.setPreferredSize(new Dimension(150, 20));
mainPanel.add(subPanel);
System.out.println(mainPanel.getSize());
}
public static void main( String[] args )
{
BoxLayoutTest testFrame = new BoxLayoutTest();
testFrame.setVisible(true);
}
}
起初,我遇到了包含 JLabel 的面板没有像使用首选大小那样调整大小的问题。我发现这是因为我使用 mainPanel.getSize() 的一些变体作为子面板的首选尺寸。在这个例子中,我使用了实际的数值,这很有效。
它不能以旧方式工作的原因(这实际上是我希望有人解释的事情),这就是为什么,如 SOP 行中所见, mainPanel.getSize() 返回宽度和高度为 0 而它显然占据了整个屏幕,即 400x300。
感谢@camickr 告诉我不应该为我的面板设置首选大小,这有助于我找出问题出在哪里。