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)
该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)