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


114

我有这个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);
    }
}

Answers:


173

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

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

5
是的,但是删除它会使问题变得困惑,现在不是吗?
迈克尔·迈尔斯

75

我也发现了这个错误:

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

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

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

这将起作用。


16

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

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

5

如果您在布局上使用JFramelike:

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!"));

当你救了我,-为什么这是唯一提到getContentPane()的答案?
亚历山大·麦克努利

@AlexanderMcNulty,可能是因为JFrames通常不需要它(与AWT不同Frame)。从JFrame文档:As a convenience, the add, remove, and setLayout methods of this class are overridden, so that they delegate calls to the corresponding methods of the ContentPane. For example, you can add a child component to a frame as follows: frame.add(child); And the child will be added to the contentPane. The content pane will always be non-null. 通过frame他们指的是JFrame实例。
alife

@AlexanderMcNulty,此外,JFrame中只有一个内容窗格,并且始终保证在那里。
alife
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.