【问题标题】:when should I use JFrame.add(component) and JFrame.getContentPane().add(component) in java我什么时候应该在 java 中使用 JFrame.add(component) 和 JFrame.getContentPane().add(component)
【发布时间】:2011-11-25 03:07:25
【问题描述】:

它们之间有区别吗?有什么条件可以用一个代替另一个吗?

【问题讨论】:

    标签: java swing user-interface frame


    【解决方案1】:

    如果您的问题只是关于 JFrame#add(JComponent)JFrame.getContentPane()#add(JComponent) 那么没有区别,但如果你想改变 f.e.然后,BackGround 取决于您是从 JFrame#setBackground(Color) 调用方法还是从 awt.Frame JFrame.getContentPane()#setBackground(Color) 嵌套或继承方法...

    【讨论】:

      【解决方案2】:

      根据我对 Javadocs 的理解,JFrame.add 调用后者。这是解决 AWT 框架与 Swings JFrame 不兼容的一种便捷方法。

      来自javadocs for JFrame

      JFrame 类与 Frame 略有不兼容。像所有其他人一样 JFC/Swing 顶级容器,一个 JFrame 包含一个 JRootPane 作为它的 唯一的孩子。根窗格提供的内容窗格应作为 规则,包含 JFrame 显示的所有非菜单组件。 这与 AWT Frame 的情况不同。作为一个方便添加和 它的变体、remove 和 setLayout 已被覆盖以转发到 contentPane 根据需要。这意味着你可以写:

         `frame.add(child);`
      

      并且孩子将被添加到 内容窗格。内容窗格将始终为非空。试图 将其设置为 null 将导致 JFrame 抛出异常。这 默认内容窗格将设置一个 BorderLayout 管理器。参考 到 RootPaneContainer 以获取有关添加、删除和设置 JFrame 的 LayoutManager。

      【讨论】:

        【解决方案3】:

        两个调用都是一样的。在 Java 5 中,他们更改了 jframe.add 以将调用转发到内容窗格。

        来自Java 5 release notes

        最后,七年后,我们使 jFrame.add 等同于 jFrame.getContentPane().add().

        另外,请参阅javadocs

        【讨论】:

          【解决方案4】:

          add() 会将工作转发给addImpl()JFrame 的 JavaDoc 声明如下:

          默认情况下,子元素被添加到 contentPane 而不是框架中。

          因此,这两种方法具有相同的基本行为,除了使用getContentPane().add(...) 更为明确。

          请注意,您可以更改 add 的默认行为(使用 setRootPaneCheckingEnabled(false)),但我不确定您是否愿意这样做。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-10
            • 1970-01-01
            • 1970-01-01
            • 2017-04-03
            • 2010-12-30
            相关资源
            最近更新 更多