122

我有这个 JavaJFrame类,我想在其中使用 boxlayout,但我收到一条错误消息java.awt.AWTError: BoxLayout can't be shared。我见过其他人有这个问题,但他们通过在内容窗格上创建 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

4 回答 4

187

您的问题是您正在BoxLayoutJFrame( this) 创建一个,但将其设置为JPanel( getContentPane()) 的布局。尝试:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);
于 2009-04-17T17:26:04.690 回答
81

我也发现了这个错误:

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

将 JPanel 传递给 BoxLayout 时,它尚未初始化。所以像这样拆分这一行:

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

这将起作用。

于 2010-07-27T19:30:40.753 回答
17

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

JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));
于 2011-09-07T20:46:06.910 回答
12

如果您正在使用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!"));
于 2017-12-13T05:19:06.610 回答