Я думаю, что решил свою проблему, но я не знаю, почему она работает таким образом, поэтому я надеюсь, что кто-то сможет мне это объяснить, чтобы я не повторил эту ошибку в будущем.
Вот краткий пример того, что я пытаюсь сделать:
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 за сообщение, что я не должен устанавливать предпочтительный размер для своих панелей, это помогло мне понять, откуда возникла проблема.