对JFrame添加panel有常用的两种方式:
(1)getContentPane().add(panel);
(2)setContentPane(panel);
对于二者的区别,我并没有深究,只是参考别人的,人云亦云。
API在线文档中写道:
getContentPane
public Container getContentPane()
-
返回此窗体的
contentPane
对象 -
-
指定者:
-
接口
RootPaneContainer
中的getContentPane
-
接口
-
-
返回:
-
contentPane
属性
-
setContentPane
public void setContentPane(Container contentPane)
-
设置
contentPane
属性。此方法由构造方法调用。Swing 的绘制架构要求在包含层次结构中有不透明的
JComponent
。这通常由内容窗格提供。如果要替换内容窗格,建议用不透明的JComponent
替换它。 -
-
指定者:
-
接口
RootPaneContainer
中的setContentPane
-
接口
-
-
参数:
-
contentPane
- 此窗体的contentPane
对象
抛出:
-
IllegalComponentStateException
- (运行时异常)如果 contentPane 参数为null
-
首先,getContentPane()返回的是一个contentPane
对象,当我们使用getContentPane().add(panel);时,是先获得了一个
contentPane
对象,然后通过contentPane
对象调用add(),把panel加入到contentPane
中去。对于contentPane
对象的来源,我查看别人的博客,别人是如此说道:
当我们执行JFrame frame = new JFrame();时,生成了JFrame一个框架,同时也会生成一个默认的rootpanel,这个rootpanel就是覆盖在JFrame上面的,而我们调用getContentPane()时返回的contentPane
对象,其实就是rootpanel,我们再在这个rootpanel上面add(panel);添加子panel。
然后,当我们调用的是setContentPane(panel),我们是将该panel替换了覆盖在JFrame上面的rootpanel,所以,界面也会改变。
参考资料:
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
http://blog.51cto.com/632977922/1125583
https://www.cnblogs.com/youxin/archive/2012/04/22/2465480.html