BoxLayout растягивает компонент для соответствия родительской панели - PullRequest
20 голосов
/ 03 февраля 2010

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

Ответы [ 5 ]

23 голосов
/ 04 февраля 2010

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

panel.setMaximumSize( panel.getPreferredSize() );
10 голосов
/ 03 февраля 2010

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

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

5 голосов
/ 09 сентября 2013

Это, кажется, работает отлично ... используя 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);
4 голосов
/ 03 февраля 2010

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

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

3 голосов
/ 03 февраля 2010

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

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

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