Java Swing的BoxLayout忽略AlignmentX

6
在下面的代码中,通过使用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个回答

8
基本上,在BoxLayout中无法有不同的对齐方式,参见如何使用BoxLayout 一般来说,由从上到下的BoxLayout控制的所有组件都应该具有相同的X对齐方式。 编辑 通常,并没有记录每个组件类型的默认对齐方式(JSlider默认居中,我错误地认为JLabel是居中对齐而实际上是左对齐;-))。一种方法是在某个地方保留列表,另一种方法是在添加时强制将它们全部设置为相同的对齐方式。
或者使用第三方layoutManager,它不会像这样令人费解地混合布局和对齐方式。

1
我阅读了那个页面,但我认为滑块“没有”对齐。如何强制所有组件具有相同的对齐方式? - Mizipzor
不直观可能是今天的轻描淡写。但至少现在我已经让它工作了。谢谢! :) - Mizipzor
截至2021年,这个答案是错误的(至少对于Java 11是如此)。这可以通过将问题布局设置为容器,即setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));,然后在子组件上使用.setAlignmentX(int);来轻松展示。对于0,它们被左对齐,值越高,这些组件就向右移动得越远。所以你可以BoxLayout 有不同的对齐方式 - 不管这是否有意。 - Koenigsberg
这意味着可以使用诸如 Component.LEFT_ALIGNMENT 的定义来设置 BoxLayout 的对齐方式。 - Koenigsberg
@Koenigsberg 嗯...不知道你的意思:问题中的混合对齐(label == LEFT and slider == CENTER)仍然会导致不可预测的布局(在这里,标签似乎也居中,但是对于不同的混合输出可以是任何东西)。据我所知,在java12上测试时版本没有变化。 - kleopatra

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接