Я не могу заставить метод BoxLayout setPreferredSize () работать так, как я хочу - PullRequest
1 голос
/ 09 июля 2011

Я думаю, что решил свою проблему, но я не знаю, почему она работает таким образом, поэтому я надеюсь, что кто-то сможет мне это объяснить, чтобы я не повторил эту ошибку в будущем.

Вот краткий пример того, что я пытаюсь сделать:

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

Ответы [ 2 ]

2 голосов
/ 09 июля 2011

Почему [делает] mainPanel.getSize() возвращает ширину и высоту 0?

До тех пор, пока pack() "не приведет к измерению этого Windowчтобы соответствовать предпочтительному размеру и расположению его подкомпонентов, "размеры будут равны нулю.

System.out.println(mainPanel.getSize());
this.pack();
System.out.println(mainPanel.getSize());

Консоль:

java.awt.Dimension[width=0,height=0]
java.awt.Dimension[width=160,height=30]
2 голосов
/ 09 июля 2011

Трудно сказать, почему ваш код не работает, так как вы не опубликовали свой код.Несколько случайных строк кода не дают нам контекста того, как код используется в вашей программе.

Когда вы отправляете вопрос, вы должны опубликовать свой SSCCE , который демонстрирует проблему.

Клей не должен был решить проблему.Панель должна все еще отображаться, просто она может не отображаться в той позиции, в которой вы ожидаете.BoxLayout попытается изменить размеры добавленных к нему компонентов, чтобы заполнить все доступное для него пространство.

Вам не следует использовать setPreferredSize () на панели.Задачей менеджера макета является вычисление предпочтительного размера панели на основе предпочтительного размера всех добавленных в нее компонентов.Поэтому я бы сказал, что ваш код по-прежнему неверен.

Есть ли разница между вводом this и this.getContentPane ()

Некоторые вызовы методов автоматически перенаправляются на контентпанель кадра, поэтому конечный результат такой же.Прочитайте API JFrame.Это указано в описании API или для рассматриваемого метода.

...