gpt4 book ai didi

java - 为什么需要用 BoxLayout 调用 setLayout?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:33 24 4
gpt4 key购买 nike

大多数布局管理器都有无参数构造函数(也就是说,您可以使用 new FlowLayout() 创建 FlowLayout,使用 new GridLayout() 创建 GridLayout,使用 GridBagLayout与 new GridBagLayout() 等)。但是,BoxLayout 要求您同时传递它将管理的容器和组件应沿其布局的轴。

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

BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);

而不只是第一行?

我快速浏览了一下 the BoxLayout source code并看到我使用的构造函数(第 178-185 行)没有调用 target.setLayout(this) 或任何类似的东西。添加它似乎真的很简单。为什么它没有包含在 Swing 库中?

如果重要,我正在使用

java version 1.7.0

Java(TM) SE Runtime Environment (build 1.7.0-b147)

在 Win7Pro 上。

谢谢!


中南合作:

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

最佳答案

Container 必须存在才能传递给 BoxLayout。通常一个人会这样写:

JPanel myPanel = new JPanel();
BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);

将最后两行结合起来很诱人,但最小惊奇原则表明布局的构造函数不应该以其他方式改变容器的状态。

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

public class Box extends JComponent implements ... {

public Box(int axis) {
super();
super.setLayout(new BoxLayout(this, axis));
}
}

现在一行就可以了:

Box myBox = new Box(BoxLayout.Y_AXIS);

关于java - 为什么需要用 BoxLayout 调用 setLayout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10867879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com