【问题标题】:BoxLayout for a JFrameJFrame 的 BoxLayout
【发布时间】:2014-09-10 12:39:54
【问题描述】:

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

【问题讨论】:

标签: java swing layout-manager checkboxlist


【解决方案1】:

JFrame#getContentPane()上试试这个

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

阅读更多How to Use BoxLayout


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

阅读更多Adding Components to the Content Pane

这是 JFrame 的样子


编辑

来自 cmets:

好吧,反正也不清楚。我是这样分析的: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

【讨论】:

  • 工作。但我什么都听不懂。你能澄清一下我到底分享了什么吗?
  • 好吧,反正也不清楚。我是这样分析的:BoxLayout 类需要知道它的目标。 JFrame 有 setLayoutt 方法,需要知道它的布局。在所有示例中,我都看到调用 setLayout 的对象和 BoxLayout 的目标是相同的。像这样:listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS));这是来自docs.oracle.com/javase/tutorial/uiswing/layout/box.html 好吧,从这个角度来看,我仍然看不出我应该 getContentPane 的原因。
  • this.setLayout() 内部调用 this.getContentPane().setLayout(),它在 JFrame 添加组件的内容窗格上应用布局。
  • 这里是Source code,我希望你现在清楚了。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多