Взаимодействие компонентов Java Swing (BoxLayout и Label) - PullRequest
1 голос
/ 21 февраля 2012

Хорошо, несколько вопросов о тестовом коде ниже ... У меня нет полной рабочей программы для публикации, но я надеюсь, что люди достаточно хорошо знают Swing, чтобы попробовать его.Это JLabel внутри JPanel (BoxLayout), и я работаю над изменением размера метки в правом нижнем углу.

То, что я получаю с кодом, как показано, это поле состояния шириной 300 на 30рост.Я возился с предпочтительным размером и минимальным размером этикетки, и, похоже, он не ведет себя рационально.

  1. Почему предпочтительный размер JPanel влияет на высоту, а не на ширину?Если я изменю размер x в setPreferredSize () на 0 или 500, он все равно выйдет из метки 300.
  2. Почему минимальный размер JLabel влияет на ширину, а не на высоту?Если я прокомментирую вызов setPreferredSize () и увеличу высоту метки до 30, ничего не произойдет.
  3. Я начал с JPanel setMinimumSize (с комментариями), но он больше не имеет никакого эффекта - почему JPanel требует setPreferredSize ()?
  4. Если я поменяю текст метки с "" на "", это увеличит высоту метки.Поскольку метка здесь не контролирует высоту, почему это вообще имеет какой-либо эффект?

Кстати, вызов createRigidArea () заставляет разделитель направлять, а не придерживатьсялевая сторона экрана.Если есть какие-то менее смелые идеи для этого, я был бы признателен.

    private JComponent makeStatusBarTest() {
    JPanel statusPanel = new JPanel();
    statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.LINE_AXIS));
    statusPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
//  statusPanel.setMinimumSize(new Dimension(0, 30));
    statusPanel.setPreferredSize(new Dimension(500, 30));
    JLabel statusLabel = new JLabel();
    Border emptyBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10);
    statusLabel.setBorder(emptyBorder);
    statusLabel.setText("");
    statusLabel.setMinimumSize(new Dimension(300, 20));
    statusPanel.add(statusLabel);
    statusPanel.add(new JSeparator(SwingConstants.VERTICAL));
    statusPanel.add(Box.createRigidArea(new Dimension(5000,0)));

    return statusPanel;
}

1 Ответ

2 голосов
/ 21 февраля 2012

Я могу объяснить # 1 и # 2:

Из javadocs BoxLayout: «BoxLayout пытается расположить компоненты с их предпочтительной шириной (для горизонтального расположения) или высотой (для вертикального размещения)».

Другими словами, BoxLayout использует внутренние компоненты (в вашем случае, statusLabel) для определения widths , а сама JPanel (в пределах разумного) для определения высоты .

Обычно вы можете использовать Glue вместо RigidArea, чтобы перемещать вещи, но я согласен, что к этому нужно привыкнуть.

# 4 - Swing слишком эффективен - если JLabelпустой текстовый прямоугольник равен 0x0.В конечном итоге определяется в SwingUtilities.layoutCompoundLabelImpl ().

Я думаю, что # 3 заключается в том, что BoxLayout пытается соблюдать предпочтительный размер внутренних компонентов.Поскольку setMinimumSize, возможно, переопределяет их предпочтительные размеры.

...