为什么需要使用BoxLayout调用setLayout?

wch*_*gin 8 java layout swing layout-manager boxlayout

大多数布局管理器都没有参数构造函数(也就是说,你可以创建一个FlowLayout new FlowLayout (),一个GridLayout new GridLayout (),一个GridBagLayout new GridBagLayout ()等).但是,BoxLayout要求您传递将要管理的容器和应该布置组件的轴.

我的问题是:既然你已经告诉布局管理器要布局哪个组件,你为什么要写

BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);
Run Code Online (Sandbox Code Playgroud)

而不只是第一行?

我参加了一个快速浏览BoxLayout源代码,看到的构造我使用(178-185线)不拨打电话到target.setLayout(this)的那种或任何东西.看起来添加它真的很简单.有没有理由为什么它不包含在Swing库中?

如果重要,我正在使用

java版本1.7.0

Java(TM)SE运行时环境(版本1.7.0-b147)

在Win7Pro上.

谢谢!


SSCCE:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

public class BoxLayoutSSCCE extends JFrame {

    // Change this to see what I mean
    public static final boolean CALL_SET_LAYOUT = true;

    public BoxLayoutSSCCE () {
        super("Box Layout SSCCE");
        JPanel panel = new JPanel();
        BoxLayout bl = new BoxLayout(panel, BoxLayout.Y_AXIS);
        if (CALL_SET_LAYOUT) {
            panel.setLayout(bl);
        }
        panel.add(new JButton("Button 1"));
        panel.add(new JButton("Button 2"));
    }

    public static void main (String[] args) {
        BoxLayoutSSCCE blsscce = new BoxLayoutSSCCE();
        blsscce.pack();
        blsscce.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

tra*_*god 5

Container必须存在,它可以传递给BoxLayout.通常一个人写这样的东西:

JPanel myPanel = new JPanel();
BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);
Run Code Online (Sandbox Code Playgroud)

结合最后两行是很诱人的,但是最不惊讶的原则表明布局的构造函数不应该改变容器的状态.

方便地,javax.swing.Box提供"使用BoxLayout对象作为其布局管理器的轻量级容器".

public class Box extends JComponent implements ... {

    public Box(int axis) {
        super();
        super.setLayout(new BoxLayout(this, axis));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在一行将做:

Box myBox = new Box(BoxLayout.Y_AXIS);
Run Code Online (Sandbox Code Playgroud)