2012-02-10 2 views
5

В приведенном ниже коде, позвонив по телефону setAlignmentX с Component.LEFT_ALIGNMENT Я ожидал получить выровненную слева метку над центрированным слайдером. По какой-то причине метка также имеет центр, по-видимому, независимо от того, какое значение передается setAlignmentX.Java Swing BoxLayout игнорирование AlignmentX

Какое значение необходимо передать setAlignmentX, чтобы его совпадение осталось?

package myjava; 

import java.awt.Component; 
import java.awt.Container; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JSlider; 

public class LayoutTest { 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame("BoxLayoutDemo"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       // create left aligned label over centered column 
       Container contentPane = frame.getContentPane(); 
       contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); 
       JLabel label = new JLabel("test"); 
       label.setAlignmentX(Component.LEFT_ALIGNMENT); 
       contentPane.add(label); 
       contentPane.add(new JSlider()); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

ответ

8

В принципе, вы не можете иметь различные выравнивания в BoxLayout, от How To Use BoxLayout

В общем, все компоненты, управляемые сверху-вниз BoxLayout объекта должны иметь один и тот же выравнивание X ,

Редактировать

Как правило, это не документировано, которые по умолчанию выравнивания типа компонента (JSlider центрирована по умолчанию, я неправильно считал, что JLabel были сосредоточены в то время как он выровнен по левому краю ;-) Один опция состоит в том, чтобы сохранить список где-нибудь (dooooh ...), другой - просто заставить их всех к одинаковому выравниванию при добавлении.

Или используйте сторонний layoutManager, у которого нет этого довольно unintuitve (для меня) смешения компоновки и выравнивания.

+0

Я читал эту страницу, но я думал, что ползунок «не было» выравнивание. Каков наилучший способ обеспечить такое выравнивание для всех компонентов? – Mizipzor

+0

Неинтуитивный будет преуменьшением дня. Но, по крайней мере, сейчас я работаю. Благодаря! :) – Mizipzor

0

BoxLayout имеет странное поведение. Попробуйте использовать вместо GridBagLayout:

https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

public class Aligment { 
    public static void main(String[] args) { 

    final JPanel root = new JPanel(new GridBagLayout()); 
    root.setPreferredSize(new Dimension(500, 400)); 

    root.add(new JLabel("LEFT"), new GridBagConstraints() {{ 
     gridx = 0; 
     gridy = 0; 
     anchor = PAGE_START; 
    }}); 
    root.add(new JLabel("CENTER"), new GridBagConstraints() {{ 
     gridx = 1; 
     gridy = 1; 
     anchor = CENTER; 
     weightx = 1.0; // fill Width 
    }}); 
    root.add(new JLabel("RIGHT"), new GridBagConstraints() {{ 
     gridx = 2; 
     gridy = 2; 
     anchor = LINE_END; 
    }}); 
    // hack: Push all rows to Top 
    root.add(Box.createVerticalGlue(), new GridBagConstraints() {{ 
     gridx = 0; 
     gridy = 3; 
     weighty = 1.0; // fill Height 
    }}); 

    new JFrame() { 
     { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setContentPane(root); 
     pack(); 
     setLocationRelativeTo(null);; 
     } 
    }.setVisible(true); 
    } 
} 
Смежные вопросы