为什么使用Swing BoxLayout对象加入

时间:2010-02-22 00:22:46

标签: java swing layout

有人可以解释为什么文字“选项”在这里缩进了吗?这看起来像BoxLayout中的一个错误。 TIA

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

2 个答案:

答案 0 :(得分:4)

这里的问题是JLabel的右边缘与面板的中心对齐,而滚动窗格的中心与面板的中心对齐。

我能够通过添加两行来解决这个问题,将labeljscrlpBox的水平对齐设置为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),而不是我想要的那些。就在那时,我意识到它的右边缘与另一个组件用于排列其中心的线条相同。

答案 1 :(得分:2)

阅读Using a Box Layout上的Swing教程中的部分。有一些例子试图解释每个组件的“X对齐”如何影响布局。

如果你描述了你想要做什么,或者你期望发生什么,也许我们可以建议使用不同的布局管理器组合。