为什么JFrame最初需要getContentPane()来添加组件

时间:2012-02-07 01:32:50

标签: java swing jframe

我知道,as of Java 1.5,可以像这样在JFrame中添加一个组件:

  

myFrame.add(myButton的);

而不是:

  

myFrame.getContentPane()添加(myButton的);

为什么总是这样?

2 个答案:

答案 0 :(得分:9)

正如JFrame API中所述,两者都做同样的事情:向contentPane添加一个组件。它刚刚出现(也许是Java 1.5?)Swing添加了语法糖/便利方法,允许您直接在JFrame(或任何其他Swing顶级容器)上进行此调用,但您仍在添加到contentPane。 remove(...)setLayout(...)的情况相同如果您尝试通过myJFrame.setBackground(Color.green);设置JFrame的背景颜色并且没有任何反应,则会变得非常清楚。正是出于这个原因,我对这一变化并不满意。那也是因为我必须是一个古老的吝啬鬼。

答案 1 :(得分:7)

  

4753342:Swing的顶级组件应该重定向添加/删除   ContentPane的方法

说明:

     

与AWT编程相反,   JFrame / JDialg / JWindow / JApplet / JInternalFrame不允许您添加   Component,而你必须了解JRootPane并添加   孩子Component对它。这给新人带来了不必要的困惑   开发者。

     

在5.0之前,尝试从其中一个添加或删除Component   这些顶级Component将导致抛出异常。在   5.0,不会抛出任何异常,而是在内容窗格中添加或删除Component。这导致了一些修改   到JFrameJDialogJWindowJApplet的javadoc和   JInternalFrame。这已在RootPaneContainer中进行了总结   的Javadoc:

 * For conveniance
 * <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>,
 * <code>JApplet</code> and <code>JInternalFrame</code>, by default,
 * forward all calls to <code>add</code> and its variants,
 * <code>remove</code> and <code>setLayout</code> to the
 * <code>contentPane</code>. This means rather than writing:
 * <pre>
 * rootPaneContainer.getContentPane().add(component);
 * </pre>
 * you can do:
 * <pre>
 * rootPaneContainer.add(component);
 * </pre>
 * <p>
 * The behavior of <code>add</code> and its variants and
 * <code>setLayout</code> for
 * <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>,
 * <code>JApplet</code> and <code>JInternalFrame</code> is controlled by
 * the <code>rootPaneCheckingEnabled</code> property. If this property is
 * true, the default, then <code>add</code> and its variants and
 * <code>setLayout</code> are
 * forwarded to the <code>contentPane</code>, if it is false, then these
 * methods operate directly on the <code>RootPaneContainer</code>. This
 * property is only intended for subclasses, and is therefor protected.

此外,这是一个相关的错误: