为什么要使用Swing BoxLayout来布置对象?

4
有人可以解释一下为什么这里的文本“选项”会缩进吗?这看起来像是BoxLayout中的一个错误。谢谢。
import javax.swing.*;
import java.awt.*;

public class BoxLayoutIssue {

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setSize(240, 250);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JLabel label = new JLabel("Option");
        panel.add(label);

        JLabel a = new JLabel("A");
        JLabel b = new JLabel("B");
        JLabel c = new JLabel("C");
        JLabel d = new JLabel("D");
        JLabel e = new JLabel("E");

        Box box = Box.createVerticalBox();
        box.add(a);
        box.add(b);
        box.add(c);
        box.add(d);
        box.add(e);

        JScrollPane jscrlpBox = new JScrollPane(box);
        jscrlpBox.setPreferredSize(new Dimension(140, 90));
        panel.add(jscrlpBox);

        f.add(panel);

        f.setVisible(true);
    }
}

与您的问题无关 - 您应该在AWT事件线程中执行此操作。请参见SwingUtilities.invokeLater(Runnable)。 - Steve Kuo
可能吧。 :) 我只是匆忙地写了这个来解释我遇到的问题。 - sproketboy
2个回答

4
这里的问题是JLabel将其右边缘与面板中心对齐,而滚动窗格将其中心与面板中心对齐。我通过添加两行代码解决了这个问题,将label和jscrlpBox的水平对齐方式都设置为Component.LEFT_ALIGNMENT:
JLabel label = new JLabel("Option");
label.setAlignmentX(Component.LEFT_ALIGNMENT); // Added

panel.add(label);

JLabel a = new JLabel("A");
JLabel b = new JLabel("B");
JLabel c = new JLabel("C");
JLabel d = new JLabel("D");
JLabel e = new JLabel("E");

Box box = Box.createVerticalBox();
box.add(a);
box.add(b);
box.add(c);
box.add(d);
box.add(e);

JScrollPane jscrlpBox = new JScrollPane(box);
jscrlpBox.setPreferredSize(new Dimension(140, 90));
panel.add(jscrlpBox);
jscrlpBox.setAlignmentX(Component.LEFT_ALIGNMENT); // Added

通常,当像这样解决问题时,我会尝试添加鲜艳的边框线到组件(在这种情况下是label),以确认它们是否不在我想要的位置上。那时我意识到,它的右边缘与其他组件用于中心对齐的同一条线对齐。

2
阅读Swing教程中关于使用Box布局的部分。那里有一些示例,试图解释每个组件的“X对齐”如何影响布局。
如果您描述您要做什么,或者您期望发生什么,也许我们可以建议使用不同的布局管理器组合。

是的,谢谢。我会再读一遍的。只是似乎左对齐会自动发生。 :) - sproketboy
你肯定不是第一个这样想的人。如果每种组件默认都有相同的对齐方式,那就更好了,但事实并非如此。 - Joe Carnahan
好的,谢谢。我可能会创建组件的子类来设置我想要的所有默认值。 - sproketboy

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