2012-02-21 3 views
1

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

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

  1. Почему JPanel Preferred Size влияет на высоту, но не на ширину ? Если я изменил размер 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

Не показывайте нам «полную программу», но на том же токене отправляете * небольшую * программу, которая компилирует и запускает и демонстрирует проблему, [sscce] (http://sscce.org) поможет нам быть намного лучше, чтобы помочь вам. –

+3

@orbfish пожалуйста, что нового 'Dimension (5000,0)));' сколько (я могу сосчитать три) монитора, которые вы хотите нарисовать, и с нулевой высотой – mKorbel

+0

@HovercraftFullOfEels - кажется, новая религия sscce, люди держат ссылаясь на него. Я сказал, что не могу опубликовать рабочую программу. – orbfish

ответ

2

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

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

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

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

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

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

+0

Спасибо за ответы. Таким образом, стандартная горизонтальная компоновка BoxLayout делегирует ее размер внутренним компонентам. Я попробовал Клей, кстати, не имел никакого эффекта, должен что-то упустить. Все еще не получают PreferredSize против MinimumSize, но это похоже на компонентный компонент или даже макет по-макету, поэтому пользователь может отчаиваться, когда-либо выясняя это. – orbfish

+0

Если вы установите минимальный размер, а затем пользователь изменит размер панели до этого минимального размера, это может оказаться невозможным для «честности» предпочтительной ширины компонентов. Вот как я об этом думаю. Но я не уверен, что действительно происходит внутри ... :-) – user949300

Смежные вопросы