Привет, я использую BoxLayout
для стека JPanel
поверх друг друга (BoxLayout.Y_AXIS
), например, если мой родительский элемент JPanel
имеет высоту 500 пикселей, и я добавляю к нему две дочерние панели высота 100 пикселей. BoxLayout
растягивает их так, что вместе они занимают пространство 500 пикселей. Кто-нибудь знает, как отключить эту функцию?
BoxLayout растягивает компонент, чтобы он соответствовал родительской панели
Ответ 1
Вместо этого используйте GridBagLayout. У вас гораздо больше контроля над пользовательским интерфейсом.
Но если вы хотите использовать BoxLayout еще и не хотите, чтобы они растягивались, вы можете проверить
Ответ 2
BoxLayout - один из немногих менеджеров макетов, который учитывает минимальные и максимальные размеры компонента. Поэтому, если вы хотите предотвратить растягивание панели, вы можете использовать:
panel.setMaximumSize( panel.getPreferredSize() );
Ответ 3
Ваши панели растягиваются, потому что BoxLayout не ограничивает каждую панель предпочтительным размером. Вам нужно найти макеты, которые соблюдают предпочтительный размер компонента, как это делают позиции BorderLayout NORTH и SOUTH.
Попробуйте следующее:
- Создайте JPanel с BorderLayout. Добавьте этот дочерний компонент как СЕВЕР в этот JPanel.
- Создайте второй JPanel для другого дочернего компонента, добавьте его как NORTH из BorderLayout
- Добавьте два 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);
Ответ 4
Кажется, что это работает отлично... используя BoxLayout, как вы хотели.
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);
Ответ 5
Трюк, как упоминалось в предыдущем ответе, - использовать клей, наполнители и жесткие области в макете. Однако, в отличие от этого ответчика, я бы рекомендовал придерживаться BoxLayout - вы можете проще всего упростить интерфейс с Box, чем с помощью Grid Bag; и дополнительная мощность не покупает вас в типичном диалоговом окне.
В старой идиоме это были такие вещи, как Box.createHorizontalStrut(int x) и Box.createHorizontalGlue(); идея заключается в том, что вы ставите стойку между вашим первым и вторым компонентами, а затем добавляете клей после второго. ( "стойка" = "жесткая область" в настоящее время).