выравнивание java BoxLayout панели - PullRequest
11 голосов
/ 09 февраля 2012

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

//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. Спасибо за любую помощь или предложения.

Ответы [ 3 ]

26 голосов
/ 09 февраля 2012

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

   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);
13 голосов
/ 09 февраля 2012

Создайте горизонтальный объект 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 ) );

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

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

5 голосов
/ 09 февраля 2012

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

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

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

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

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

...