2011-09-22 4 views
6

Я работаю над графическим интерфейсом Swing и получаю некоторые необычные и нежелательные пробелы после добавления JSeperator, любая идея, как их удалить? Или любой другой вариант, как добиться этого!Необычные пробелы при использовании JSeperator - Java

Визуальная Описание

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

Спасибо.

+0

Вы пробовали использовать горизонтальный клей или пустую границу для экземпляров 'JSeparator'? – mrkhrts

+0

@mrkhrts клей не помогает, это просто еще один компонент с неограниченным max ;-) – kleopatra

ответ

7

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

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

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

+0

nonononono ... never setXXSize - это правило выполняется для ... хорошо ВСЕГДА и ВСЕ (даже вы и я ) – kleopatra

+0

Это на самом деле сработало, Но теперь я не должен, как вы сказали, O (нет) нет с Big O;), я попробую рекомендацию Говарда, я думаю, это должно сработать! – doNotCheckMyBlog

+0

@ kleopatra damn! Я думал, что вы и я защищены от иммунитета и мог бы это сделать ;-) Серьезно, однако, я не считаю это критичным в вышеприведенном фрагменте (пока размер жесткого кодированного пикселя не появляется, он по-прежнему выглядит acce ptable для меня). – jfpoilpret

1

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

+0

Если я использую FlowLayout, Swing docent покажет JSeperator вообще :(, Очень интересно. – doNotCheckMyBlog

0

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

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

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

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

+0

Если я использую FlowLayout, Swing docent покажет JSeperator вообще :(, очень интересно – doNotCheckMyBlog

+0

@SkeetOverFlow Вы правы, поэтому всегда можете положить его в другой контейнер. – Howard

4

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

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

The REAS на FlowLayout не показывает разделители на всех,

  • JSeparator имеет прив высоту 0
  • FlowLayout дает каждому ребенку его прив размер

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

(удалено снова редактировать, BorderLayout.юг/север не ;-)

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