布局分配错误:BoxLayout无法共享

127

我有一个Java的JFrame类,在其中我想使用一个boxlayout,但是我收到了一个错误提示:java.awt.AWTError: BoxLayout can't be shared。我看到其他人也遇到了这个问题,但他们通过在contentpane上创建boxlayout来解决它,而这正是我在这里做的事情。这是我的代码:

class EditDialog extends JFrame {
    JTextField title = new JTextField();
    public editDialog() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("New entity");
        getContentPane().setLayout(
            new BoxLayout(this, BoxLayout.PAGE_AXIS));
        add(title);
        pack();
        setVisible(true);
    }
}
4个回答

191

你的问题在于,你为一个JFrame (this) 创建了一个BoxLayout,但是将其设置为JPanel (getContentPane())的布局。尝试:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);

6
是的,但是去掉它会让问题变得更加混淆,不是吗? - Michael Myers

84

我也遇到了这个错误,是因为我做了这个:

JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

当将JPanel传递给BoxLayout时,它尚未初始化。 将此行拆分为以下形式:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
这将有效。

17

我认为从之前的回答中需要强调的一个重要事项是,BoxLayout的目标(第一个参数)应该是与调用setLayout方法的容器相同,如下例:

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

15

如果您正在像下面这样使用 JFrame 的布局:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));
控件实际上被添加到了ContentPane中,所以它看起来像是在JFrame和ContentPane之间“共享”。请按照以下做法操作:
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

2
你救了我,为什么只有这个答案提到了getContentPane()方法? - Alexander McNulty
@AlexanderMcNulty,可能是因为JFrame通常不需要它(不像AWT的Frame)。从JFrame文档中可以看到:作为一种便利,此类的add、remove和setLayout方法被覆盖,以便它们将调用委托给相应的ContentPane方法。例如,您可以按如下方式向框架添加子组件:frame.add(child); 然后子组件将被添加到contentPane中。contentPane始终不为空。他们所指的frame是指一个JFrame实例。 - alife
@AlexanderMcNulty,此外,在JFrame中只有一个内容窗格,并且它始终存在。 - alife

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