关于java:分配布局时出错:BoxLayout无法共享

error upon assigning Layout: BoxLayout can't be shared

我有这个Java JFrame类,我想在其中使用boxlayout,但是出现错误消息java.awt.AWTError: BoxLayout can't be shared。 我已经看到其他人遇到了这个问题,但是他们通过在contentpane上创建boxlayout来解决了这个问题,但这就是我在这里所做的。 这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
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);
    }
}

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

1
2
3
getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);


我也发现了这个错误:

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

将JPanel传递到BoxLayout时尚未初始化。 所以像这样分割这行:

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

这将起作用。


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

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

如果您在JFrame上使用布局,例如:

1
2
3
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

该控件实际上已添加到ContentPane中,因此它看起来像是在JFrameContentPane之间"共享"的

改为这样做:

1
2
3
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));