我知道,as of Java 1.5,可以像这样在JFrame中添加一个组件:
myFrame.add(myButton的);
而不是:
myFrame.getContentPane()添加(myButton的);
为什么总是这样?
答案 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
。这导致了一些修改 到JFrame
,JDialog
,JWindow
,JApplet
的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.
此外,这是一个相关的错误: