JFrame的BoxLayout

2020年6月17日 24点热度 0条评论

您能帮我了解这里发生了什么吗?我咨询了Javadoc:JFrame具有setLayout方法。因此,出现共享错误对我来说是一个谜。

public class View extends JFrame {
    public View(){

        // LayoutManager for the whole frame.
        this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    }
}

结果

Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared
    at javax.swing.BoxLayout.checkContainer(BoxLayout.java:465)
    at javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:249)
    at java.awt.Container.invalidate(Container.java:1583)
    at java.awt.Component.invalidateIfValid(Component.java:2957)
    at java.awt.Container.setLayout(Container.java:1484)
    at javax.swing.JFrame.setLayout(JFrame.java:605)
    at View.<init>(View.java:16)
    at Init.main(Init.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

解决方案如下:

JFrame#getContentPane()上尝试这个

this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS));

阅读更多
How to Use BoxLayout

所有组件都添加在
JFrame's内容窗格中。

阅读更多
Adding Components to the Content Pane

这是JFrame的图形表示

编辑

来自评论:

好吧,还是不清楚。我这样分析:BoxLayout类需要知道它的目标。 JFrame具有setLayoutt方法,需要知道其布局。

this.setLayout(manager)内部调用
getContentPane().setLayout(manager);

下一行

this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

转换为以下不正确的行。

this.getContentPane().setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

有关更多详细信息,请参见
Source code