JFrame 的 BoxLayout 布局方式

3

你能帮我理解这里发生了什么吗?我查阅了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)

BoxLayout无法共享错误。 - dieter
1个回答

4
尝试在JFrame的getContentPane()上使用这个: 网页链接
this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS));

阅读更多 如何使用BoxLayout


所有组件都被添加到JFrame的内容窗格中。

阅读更多 将组件添加到内容窗格中

这是JFrame的图片表示形式

enter image description here


编辑

来自评论:

无论如何都不清楚。我像这样分析: 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));

想了解更多详细信息,请参考源代码


工作了。但我什么也不理解。你能澄清一下我分享了什么? - Michael
嗯,不太清楚。我这样分析:BoxLayout类需要知道它的目标。JFrame有一个setLayout方法,需要知道它的布局。在我看过的所有示例中,调用setLayout和BoxLayout的目标对象是相同的。就像这样:listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS)); 这是来自http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html。嗯,在这种情况下,我仍然看不出为什么我应该使用getContentPane。 - Michael
this.setLayout() 内部调用 this.getContentPane().setLayout(),该方法在内容面板上应用布局,而 JFrame 在该面板上添加组件。 - Braj
这里是源代码,希望现在对您来说已经清晰明了。 - Braj

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