BoxLayout расширяет компонент для установки родительской панели

Привет я использую a BoxLayout сложить JPanels друг на друге (BoxLayout.Y_AXIS), например, если мой родитель JPanel имеет высоту 500 пикселей, и я добавляю две дочерних панели к ней обе из высоты 100 пикселей. BoxLayout расширяет их так, чтобы вместе они заняли 500 пкс пространства. Кто-либо знает, как отключить эту опцию?

20
задан Lukas Rotter 14 December 2015 в 15:37
поделиться

4 ответа

Используйте вместо него GridBagLayout . У вас гораздо больше контроля над своим пользовательским интерфейсом.

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

10
ответ дан 29 November 2019 в 23:33
поделиться

BoxLayout - один из немногих менеджеров верстки, который уважает минимальный и максимальный размер компонента. Поэтому, если вы хотите предотвратить растяжение панели, вы можете использовать:

panel.setMaximumSize( panel.getPreferredSize() );
23
ответ дан 29 November 2019 в 23:33
поделиться

Ваши панели растягиваются, потому что BoxLayout не ограничивает каждую панель до желаемого размера. Вам необходимо найти раскладки, которые соответствуют предпочитаемому размеру компонента, как это делается в позициях BorderLayout's NORTH и SOUTH.

Попробуйте следующее:

  1. Создайте JPanel с BorderLayout. Добавьте ваш дочерний компонент как NORTH в эту JPanel.
  2. Создайте вторую JPanel для другого дочернего компонента и добавьте ее как NORTH в BorderLayout
  3. Добавьте две JPanels в BoxLayout.

Код:

JPanel panel1 = new JPanel(new BorderLayout());
panel1.add(component1, BorderLayout.NORTH);
JPanel panel2 = new JPanel(new BorderLayout());
panel2.add(component2, BorderLayout.NORTH);

JPanel boxPanel = new JPanel();
BoxLayout boxLayout = new BoxLayout(boxPanel, BoxLayout.Y_AXIS);
boxPanel.setLayout(boxLayout);
boxPanel.add(panel1);
boxPanel.add(panel2);
3
ответ дан 29 November 2019 в 23:33
поделиться

Хитрость в том, чтобы, как и в предыдущем ответе, использовать клей, наполнители и жесткие области в раскладке бокса. Однако, в отличие от этого ответчика, я бы рекомендовал придерживаться BoxLayout - с помощью Box можно добиться большей простоты в использовании, чем с помощью Grid Bag; при этом дополнительная мощность в типичном диалоговом окне не принесет вам много пользы.

В старой идиоме это были такие вещи, как Box.createHorizontalStrut(int x) и Box.createHorizontalGlue(); идея в том, что вы ставите стойку между первой и второй компонентами, а затем добавляете клей после второй. ("strut" = "жесткая область" в настоящее время).

4
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: