выравнивание панели java BoxLayout

Я просмотрел и не нашел решения, которое специально подходит для моей ситуации. У меня есть панель, которую я отображаю в диалоговом окне:

//create dialog panel
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(headerPanel);
panel.add(type1Panel);
panel.add(type2Panel);
panel.add(type3Panel);
panel.add(type4Panel);
panel.add(type5Panel);
panel.add(type6Panel);

int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION);

Размер последних двух панелей, type5 и type6, одинакового размера, поэтому они выглядят нормально. Однако заголовок и первые 4 панели имеют разные размеры, и я бы хотел, чтобы все они были выровнены по левому краю. Пока я не нашел хорошего решения, как это исправить.

Вопрос в том, как я могу выровнять по левому краю первые 5 панелей, но не последние 2? Если нет, то как я могу выровнять их все по левому краю? Функция setalignmentx() недоступна для панелей. Я пытался использовать GridLayout, но тогда ширина главного окна графического интерфейса довольно велика и плохо вписывается в экран, следовательно, BoxLayout вдоль оси Y. Спасибо за любую помощь или предложения.


person whitewolfpgh    schedule 09.02.2012    source источник
comment
работаю с этим прямо сейчас: headerPanel.setAlignmentX(Component.LEFT_ALIGNMENT); Но, похоже, волей-неволей. Я видел, как люди упоминали, чтобы не делать этого.   -  person whitewolfpgh    schedule 09.02.2012
comment
The setalignmentx() isn't available for panels. - setAlignmentX() доступен для меня. Не могли бы вы уточнить?   -  person Thomas    schedule 09.02.2012
comment
Ну я разобрался с проблемой. Если вы сделаете panel.add(headerPanel); затем выполните headerPanel.setAlignmentX(Component.LEFT_ALIGNMENT); он не будет правильно выравниваться. Однако, сначала выполнив выравнивание, а затем добавив headerPanel на панель диалога, все работает отлично. Иди разберись.   -  person whitewolfpgh    schedule 09.02.2012
comment
Я использовал headerPanel.setAlighmentX(Component.LEFT_ALIGNMENT);. setAlignmentX искал тип float? И не работал.   -  person whitewolfpgh    schedule 09.02.2012


Ответы (3)


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

   JPanel a = new JPanel();
   JPanel b = new JPanel();
   JPanel c = new JPanel();

   a.setBackground( Color.RED );
   b.setBackground( Color.GREEN  );
   c.setBackground( Color.BLUE );

   a.setMaximumSize( new Dimension(  10, 10) );
   b.setMaximumSize( new Dimension(  50, 10) );

   a.setAlignmentX( Component.LEFT_ALIGNMENT );//0.0
   b.setAlignmentX( Component.LEFT_ALIGNMENT );//0.0
   c.setAlignmentX( Component.LEFT_ALIGNMENT );//0.0

   JPanel panel = new JPanel();
   panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
   panel.add(a);
   panel.add(b);
   panel.add(c); 

   int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION);
person cdc    schedule 09.02.2012
comment
Методы setAlignmentX и setAlignmentY принимают float, просто для ясности. JComponent имеет следующие константы выравнивания, унаследованные от java.awt.Component: BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT. Их использование делает код более читаемым, по крайней мере, для меня. - person Paul; 09.02.2012
comment
@mre Почему? В данном примере это служит только для усложнения. Код простой и достаточно читаемый. Простота важнее регулярности для таких примеров, как этот. - person Andrew S; 04.04.2014
comment
потому что наличие и использование именованных и систематических констант всегда лучше, чем предоставление магических чисел? - person ; 22.05.2014

Создайте горизонтальный объект javax.swing.Box, содержащий каждый объект typenPanel. Используя горизонтальные распорки и клей, вы можете делать все, что захотите:

Box  b1 = Box.createHorizontalBox();
b1.add( type1Panel );
b1.add( Box.createHorizontalGlue() );
panel.add( b1 );

Для простоты напишите вспомогательный метод, который сделает это за вас:

private Component leftJustify( JPanel panel )  {
    Box  b = Box.createHorizontalBox();
    b.add( panel );
    b.add( Box.createHorizontalGlue() );
    // (Note that you could throw a lot more components
    // and struts and glue in here.)
    return b;
}

Потом:

panel.add( leftJustify( headerPanel ) );
panel.add( leftJustify( type1Panel ) );
panel.add( leftJustify( type2Panel ) );

и т. д. Вы можете усложнять каждую линию, добавляя компоненты, клей и распорки. Мне очень повезло с глубоким вложением вертикальных и горизонтальных блоков и написанием вспомогательных методов, когда я хочу сделать один и тот же макет в блоке более одного раза. Нет никаких ограничений на то, что вы можете делать, смешивая компоненты, распорки и клей по мере необходимости.

Я уверен, что есть лучший способ сделать все это, но я еще не нашел его. А динамическое изменение размера позволяет пользователю с короткими фрагментами текста использовать маленькое окно, а пользователю с большим количеством текста изменять его размер так, чтобы все поместилось.

person RalphChapin    schedule 09.02.2012

Вы должны использовать setAlignmentX на панелях, потому что он доступен для JPanel. Методы setAlignmentX и setAlignmentY находятся в JComponent, который расширяет JPanel. Это работает... У меня есть код, который использует эти методы для выравнивания панелей JPanel в BoxLayout.

Хорошо, хорошо, отредактируйте свой вопрос, пока я отвечаю на него :)

Вместо использования JPanel попробуйте использовать Box . Я обнаружил, что класс Box очень полезен в качестве контейнера. Из API:

Облегченный контейнер, использующий объект BoxLayout в качестве диспетчера компоновки. Box предоставляет несколько методов класса, полезных для контейнеров, использующих BoxLayout, даже для контейнеров, отличных от Box.

Если вы еще не видели его, учебник Как использовать BoxLayout очень полезно.

person Paul    schedule 09.02.2012
comment
Спасибо за это. setAlignmentX полезен для всех JComponent экземпляров. - person KomodoDave; 21.04.2013