什么时候应该在java中使用JFrame.add(组件)和JFrame.getContentPane()。add(component)

它们之间是否存在差异,是否存在应该使用一个而不是另一个的条件?

根据我从Javadocs的理解,JFrame.add称之为后者。 这是一种方便的方法来解决AWT框架和Swings JFrame之间的不兼容问题。

来自JFrame的javadoc :

JFrame类与Frame略有不兼容。 与所有其他JFC / Swing顶级容器一样,JFrame包含一个JRootPane作为其唯一的子级。 根窗格提供的内容窗格通常应包含JFrame显示的所有非菜单组件。 这与AWT Frame案例不同。 作为一个commiance add及其变体,remove和setLayout已被覆盖,以便在必要时转发到contentPane。 这意味着你可以写:

`frame.add(child);` 

并且孩子将被添加到contentPane。 内容窗格始终为非null。 尝试将其设置为null将导致JFrame抛出exception。 默认内容窗格将在其上设置BorderLayout管理器。 有关添加,删除和设置JFrame的LayoutManager的详细信息,请参阅RootPaneContainer。

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

从Java 5发行说明 :

最后,七年后,我们将jFrame.add等效于jFrame.getContentPane()。add()。

另外,请参阅javadoc 。

如果你的问题只是关于JFrame#add(JComponent) JFrame.getContentPane()#add(JComponent) JFrame#add(JComponent) vs JFrame.getContentPane()#add(JComponent)那么没有区别,但如果你想改变fe BackGround那么取决于你是否从JFrame#setBackground(Color)调用方法#setBackground JFrame#setBackground(Color)或嵌套或inheritance来自awt.Frame的方法JFrame.getContentPane()#setBackground(Color)

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

默认情况下,子项将添加到contentPane而不是帧。

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

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