Необычные пробелы при использовании JSeperator - Java - PullRequest
6 голосов
/ 22 сентября 2011

Я работал над Swing GUI и получал некоторые необычные и нежелательные пробелы после добавления JSeperator. Есть идеи, как их удалить? Или любой другой способ, как этого добиться!

Визуальное описание

enter image description here

Пробелы очевидны до JLabel «Скорости» и после JSlider.

Связанный код

control.setLayout(new BoxLayout(control, BoxLayout.X_AXIS));

...another code omitted...

control.add(orientation); //JLabel
control.add(norm); //JRadioButton
control.add(back); //JRadioButton
control.add(new JSeparator(SwingConstants.VERTICAL));
control.add(speedLabel); //JLabel
control.add(speed); //JSlider
control.add(new JSeparator(SwingConstants.VERTICAL));
control.add(turnOutLabel); //JLabel
control.add(right); //JRadioButton
control.add(straight); //JRadioButton
control.add(left); //JRadioButton
<ч />

Я хочу, чтобы все было отцентрировано и отделено JSeperator,

Визуальное описание

enter image description here

Спасибо.

Ответы [ 4 ]

7 голосов
/ 22 сентября 2011

Просто замените new JSeparator(...) на следующие строки (вы можете поместить их в метод, если хотите):

JSeparator separator = new JSeparator(JSeparator.VERTICAL);
Dimension size = new Dimension(
    separator.getPreferredSize().width,
    separator.getMaximumSize().height);
separator.setMaximumSize(size);

Как объяснил @kleopatra, JSeparator имеет неограниченный максимальный размер (в обоих направлениях),поэтому хитрость здесь заключается в том, чтобы ограничить максимальную ширину до предпочтительной ширины, но при этом оставить максимальную высоту без изменений (поскольку предпочтительная высота равна 0).

4 голосов
/ 22 сентября 2011

Причина, по которой BoxLayout добавляет эти пробелы, заключается в том, что

  • ширина вашей рамки (панели) больше, чем общие размеры дочерних элементов
  • JSeparator и JSlider имеют неограниченную (практически это Short.Max) максимальную ширину, в то время как все остальные имеют зависящее от содержимого max
  • BoxLayout учитывает максимальные размеры, поэтому все излишки распределяются между этими тремя

Причина, по которой FlowLayout вообще не показывает разделители,

  • JSeparator имеет высоту префа 0
  • FlowLayout дает каждому ребенку предпочтительный размер

Самый простой выход - первое предложение Ховара: добавить полный элемент управления на панель с помощью flowLayout. Более надежное решение - перейти на более мощный LayoutManager: -)

(снова отредактировано, BorderLayout.south / north нет; -)

1 голос
/ 22 сентября 2011

изменить BoxLayout на новый FlowLayout (FlowLayout.LEFT). Это должно работать. К сожалению, у меня нет реального объяснения, почему BoxLayout не работает для вас.

0 голосов
/ 22 сентября 2011

Вы можете поместить свой control на другую панель с FlowLayout.

Обновление: К сожалению, установка control для вывода потока напрямую через

control.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

не работает, поскольку предпочтительная высота разделителя равна нулю и разделители исчезнут.

...