Подтвердить что ты не робот

BoxLayout растягивает компонент, чтобы он соответствовал родительской панели

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

4b9b3361

Ответ 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, как вы хотели.

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);

Ответ 5

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

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