Java 为什么我不能在JFrame上调用add(),而必须在容器上调用它?

Java 为什么我不能在JFrame上调用add(),而必须在容器上调用它?,java,swing,jframe,Java,Swing,Jframe,我正在读头先Java。在介绍GUI时(第354页适用于拥有本书的读者),作者写道: frame.getContentPane().add(button); 您不直接向窗框中添加内容。请将窗框视为窗户周围的装饰,然后将内容添加到窗格中 在查看之后,我看到JFrame是Component的一个子类,从Component继承了add(Component),因此只需编写: frame.add(button); 为什么这本书推荐使用frame.getContentPane.add(按钮) 提前谢谢 您

我正在读头先Java。在介绍GUI时(第354页适用于拥有本书的读者),作者写道:

frame.getContentPane().add(button);
您不直接向窗框中添加内容。请将窗框视为窗户周围的装饰,然后将内容添加到窗格中

在查看之后,我看到JFrame是Component的一个子类,从Component继承了add(Component),因此只需编写:

frame.add(button);
为什么这本书推荐使用frame.getContentPane.add(按钮)

提前谢谢

您可以在JFrame上调用
add(…)
,但实际上它所做的是根据JFrame API调用
getContentPane()。add(…)
,否则称为“语法糖”。但是要明白,这样做实际上并不是将其直接添加到JFrame,而是将其添加到contentPane。这一点很重要,因为JFrame是由组件组成的,正如well所解释的


就我自己而言,我更喜欢文字
getContentPane()。添加(…)
,因为并非所有JFrame行为都会以这种方式工作,例如
setBackground(…)
,因此文字提醒我正是在做什么。

公平地说,我认为在Swing的版本中比当前版本更早,并且可能在本书编写时是当前版本,使用add-on-JFrame可能是一个错误,“add”方法得到了增强,以在以后执行通常预期的行为。