2010-02-03 3 views
17

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

+0

Как вы sepcifying размер дочерних панелей? – Ascalonian

+0

С панелью.setPrefferedSize и panel.setMinimumSize с использованием того же размера. – Aly

ответ

10

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

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

+3

Если вы меня голодали, пожалуйста, укажите причину. – Ascalonian

+0

Обязательно ознакомьтесь с разделом «Горизонтальный клей» в опубликованной ссылке. Очень полезно. – FuriousFolder

3

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

Попробуйте это:

  1. Создать JPanel с BorderLayout. Добавьте этот дочерний компонент как СЕВЕР в этом JPanel.
  2. Создайте второй JPanel для другого дочернего компонента, добавьте его как СЕВЕР 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); 
+1

Мне нравится это решение, потому что оно позволяет возиться с gridbag и изменять сами компоненты, оба из которых являются отличным плюсом. –

1

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

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

+0

Я согласен с тем, что для общих целей штабелирования GridBagLayout может быть излишним. Просто предлагаю, если он идет вперед. – Ascalonian

+0

Я попытался поставить жесткую область между двумя дочерними панелями и вертикальным клеем после второго, положить панели по-прежнему растягиваются: s – Aly

+0

Нет такой вещи, как перебор: – willcodejavaforfood

20

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

panel.setMaximumSize(panel.getPreferredSize()); 
+0

Возможно, это было недавно, но с использованием переопределенного метода getPreferredSize()? – MikeM

+0

@MikeM, нет, поскольку панель полагается на менеджер компоновки, чтобы вернуть предпочтительный размер. На самом деле лучшим решением является расширение JPanel и переопределение метода getMaximumSize() ', чтобы просто вернуть значение из метода getPreferredSize(). Таким образом, максимальный размер будет динамически вычисляться, если предпочтительный размер динамически изменяется. – camickr

+0

Интересно, спасибо. – MikeM

2

Это, кажется, работает прекрасно ... используя BoxLayout, как вы хотели.

test

this.setLayout(new FlowLayout()); // this being the JFrame 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.setPreferredSize(new Dimension(500, 500)); 
    panel.setBackground(Color.orange); 
    this.add(panel); // add the parent to the JFrame 

    JPanel pnlChild1 = new JPanel(); 
    pnlChild1.setBackground(Color.cyan); 
    pnlChild1.setMaximumSize(new Dimension(200, 100)); 

    JPanel pnlChild2 = new JPanel(); 
    pnlChild2.setBackground(Color.magenta); 
    pnlChild2.setMaximumSize(new Dimension(200, 100)); 

    panel.add(pnlChild1); 
    panel.add(pnlChild2); 
Смежные вопросы