【发布时间】:2011-11-25 03:07:25
【问题描述】:
它们之间有区别吗?有什么条件可以用一个代替另一个吗?
【问题讨论】:
标签: java swing user-interface frame
它们之间有区别吗?有什么条件可以用一个代替另一个吗?
【问题讨论】:
标签: java swing user-interface frame
如果您的问题只是关于 JFrame#add(JComponent) 与JFrame.getContentPane()#add(JComponent) 那么没有区别,但如果你想改变 f.e.然后,BackGround 取决于您是从 JFrame#setBackground(Color) 调用方法还是从 awt.Frame JFrame.getContentPane()#setBackground(Color) 嵌套或继承方法...
【讨论】:
根据我对 Javadocs 的理解,JFrame.add 调用后者。这是解决 AWT 框架与 Swings JFrame 不兼容的一种便捷方法。
JFrame 类与 Frame 略有不兼容。像所有其他人一样 JFC/Swing 顶级容器,一个 JFrame 包含一个 JRootPane 作为它的 唯一的孩子。根窗格提供的内容窗格应作为 规则,包含 JFrame 显示的所有非菜单组件。 这与 AWT Frame 的情况不同。作为一个方便添加和 它的变体、remove 和 setLayout 已被覆盖以转发到 contentPane 根据需要。这意味着你可以写:
`frame.add(child);`并且孩子将被添加到 内容窗格。内容窗格将始终为非空。试图 将其设置为 null 将导致 JFrame 抛出异常。这 默认内容窗格将设置一个 BorderLayout 管理器。参考 到 RootPaneContainer 以获取有关添加、删除和设置 JFrame 的 LayoutManager。
【讨论】:
两个调用都是一样的。在 Java 5 中,他们更改了 jframe.add 以将调用转发到内容窗格。
最后,七年后,我们使 jFrame.add 等同于 jFrame.getContentPane().add().
另外,请参阅javadocs。
【讨论】:
add() 会将工作转发给addImpl(),JFrame 的 JavaDoc 声明如下:
默认情况下,子元素被添加到 contentPane 而不是框架中。
因此,这两种方法具有相同的基本行为,除了使用getContentPane().add(...) 更为明确。
请注意,您可以更改 add 的默认行为(使用 setRootPaneCheckingEnabled(false)),但我不确定您是否愿意这样做。
【讨论】: