Привет Я использую BoxLayout
стека JPanel
сек друг на друга (BoxLayout.Y_AXIS
), например, если мой родитель JPanel
имеет высоту 500 пикселей и добавить два дочерних панелей к нему как из высота 100 пикселей. BoxLayout
растягивает их так, что вместе они занимают пространство 500 пикселей. Кто-нибудь знает, как отключить эту функцию?BoxLayout тянется компонент, чтобы соответствовать родительским панели
ответ
Используйте вместо этого GridBagLayout. У вас гораздо больше контроля над своим пользовательским интерфейсом.
Но если вы хотите использовать BoxLayout еще и не хотите, чтобы они растягивались, вы можете проверить, используя invisible component fillers, как жесткие области, клей и наполнители.
Если вы меня голодали, пожалуйста, укажите причину. – Ascalonian
Обязательно ознакомьтесь с разделом «Горизонтальный клей» в опубликованной ссылке. Очень полезно. – FuriousFolder
Ваши панели растягиваются, потому что BoxLayout не ограничивает каждую панель предпочтительным размером. Вам нужно найти макеты, которые уважают предпочтительный размер компонента, как это делают позиции NORTH и SOUTH BorderLayout.
Попробуйте это:
- Создать JPanel с BorderLayout. Добавьте этот дочерний компонент как СЕВЕР в этом JPanel.
- Создайте второй JPanel для другого дочернего компонента, добавьте его как СЕВЕР 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);
Мне нравится это решение, потому что оно позволяет возиться с gridbag и изменять сами компоненты, оба из которых являются отличным плюсом. –
Хитрость заключается в том, что предыдущий ответ уже упоминалось, использовать клей, наполнители и жесткие участки в макете коробки. Однако, в отличие от этого ответчика, я бы рекомендовал придерживаться BoxLayout - вы можете проще всего упростить интерфейс с Box, чем с помощью Grid Bag; и дополнительная мощность не покупает вас в типичном диалоговом окне.
В старой идиоме это были такие вещи, как Box.createHorizontalStrut (int x) и Box.createHorizontalGlue(); идея заключается в том, что вы ставите стойку между вашим первым и вторым компонентами, а затем добавляете клей после второго. («стойка» = «жесткая область» в настоящее время).
Я согласен с тем, что для общих целей штабелирования GridBagLayout может быть излишним. Просто предлагаю, если он идет вперед. – Ascalonian
Я попытался поставить жесткую область между двумя дочерними панелями и вертикальным клеем после второго, положить панели по-прежнему растягиваются: s – Aly
Нет такой вещи, как перебор: – willcodejavaforfood
BoxLayout является одним из немногих менеджеров макетов, которые уважают минимальные и максимальные размеры компонента. Так что если вы хотите, чтобы предотвратить панели от растягивания вы можете использовать:
panel.setMaximumSize(panel.getPreferredSize());
Возможно, это было недавно, но с использованием переопределенного метода getPreferredSize()? – MikeM
@MikeM, нет, поскольку панель полагается на менеджер компоновки, чтобы вернуть предпочтительный размер. На самом деле лучшим решением является расширение JPanel и переопределение метода getMaximumSize() ', чтобы просто вернуть значение из метода getPreferredSize(). Таким образом, максимальный размер будет динамически вычисляться, если предпочтительный размер динамически изменяется. – camickr
Интересно, спасибо. – MikeM
Это, кажется, работает прекрасно ... используя 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);
- 1. java BoxLayout выравнивание панели
- 2. Как сделать компонент полной ширины в BoxLayout
- 3. Сохраняя компонент в фиксированном положении в BoxLayout
- 4. BoxLayout показывает только последний добавленный компонент
- 5. Java: отображение панели BoxLayout в середине кадра
- 6. Колонка заголовков в boxlayout
- 7. Matplotlib тянется histogram2d вертикально
- 8. JTextArea тянется, когда setWrapLine
- 9. как нажать веб-страницу вниз, чтобы соответствовать верхней панели
- 10. Как размер WX панели, чтобы соответствовать wx.Notebook (WxPython)
- 11. JPanel Margin in BoxLayout
- 12. Компонент приборной панели Flex
- 13. Сделать компонент меньшим, чем доступная область в BoxLayout
- 14. сделать высоту панели с родительским div
- 15. JScrollPane для панели, содержащей набор меток с BoxLayout
- 16. Вертикальное выравнивание интервала BoxLayout?
- 17. RegEx, чтобы соответствовать аббревиатуры
- 18. Regex, чтобы соответствовать этому
- 19. Regex чтобы соответствовать ссылки
- 20. UILabel размера, чтобы соответствовать
- 21. Regex чтобы соответствовать список
- 22. keydown, чтобы соответствовать кнопке
- 23. Regex чтобы соответствовать экспоненциальное
- 24. boxshadow, чтобы соответствовать дизайну
- 25. Regex чтобы соответствовать URL
- 26. докер компонент имя хранилища должно соответствовать
- 27. компонент боковой панели кросс-браузера
- 28. Показать HTML в Boxlayout
- 29. BoxLayout дизайн
- 30. Swing BoxLayout
Как вы sepcifying размер дочерних панелей? – Ascalonian
С панелью.setPrefferedSize и panel.setMinimumSize с использованием того же размера. – Aly