Java Swing BoxLayout игнорирует AlignmentX - PullRequest
6 голосов
/ 10 февраля 2012

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

Какое значение я должен передать 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);
            }
        });
    }
}

Ответы [ 2 ]

9 голосов
/ 10 февраля 2012

В принципе, вы не можете иметь различные выравнивания в BoxLayout, от Как использовать BoxLayout

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

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

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

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

0 голосов
/ 03 июня 2015

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);
  }
}
...