为什么我不能在JFrame上调用add()而是必须在Container上调用它?

jos*_*nes 3 java swing jframe

我正在阅读Head First Java.在介绍GUI时(第354页为那些拥有该书的人),作者写道:

frame.getContentPane().add(button);
Run Code Online (Sandbox Code Playgroud)

"你不添加东西到帧直接.想想帧窗口周围的装饰条,又添加了东西到窗口窗格 ".

在查看JFrameJava API条目之后,我看到JFrame是Component的子类并从Component继承了add(Component),因此它可以简单地编写:

frame.add(button);
Run Code Online (Sandbox Code Playgroud)

为什么这本书建议使用frame.getContentPane.add(button)?

提前致谢!

Hov*_*els 6

可以调用add(...)JFrame,但它实际上getContentPane().add(...)是根据JFrame API调用,也称为"语法糖".但要明白,在执行此操作时,您实际上并不直接将其添加到JFrame,而实际上是将其添加到contentPane.这很重要,因为JFrame由组件组成,如JFrame /顶级窗口Swing Tutorial所述.

我自己,我更喜欢文字,getContentPane().add(...)因为不是所有的JFrame行为都会以这种方式工作,例如setBackground(...),因此文字提醒我正是我在做什么.

  • 公平地说,我认为在早于当前版本的Swing版本中,并且可能是当书编写时,使用添加JFrame可能是一个错误,并且"添加"方法得到了加强以达到通常的预期以后的行为. (2认同)