Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?
来源:互联网 发布:中华民族知乎 编辑:程序博客网 时间:2024/05/20 23:06
原文:Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?
getContentPane();//初始化一个容器
区别如下:
当你创建一个JFrame的时候JFrame jf = new JFrame();
在构造方法JFrame()内部会给jf默认添加一个rootPane 所以执行完JFrame jf = new JFrame();
这句话之后jf上面已经添加了一个默认的rootpanel了然后你再调用jf.add(panel)
这个时候,panel和rootPane是平级的
理由:
1,你可以读源代码 ,查看构造方法怎么写的
2,或者你可以测试一下,分别执行
jf.setBackground(Color.blue);
jf.getContentPane().setBackground(Color.black);
这两句代码,看看效果(实际上上面一句并不能改变界面的背景色,下面一句才可以,因为rootPane把jf给挡住了,上面一句是改变了jf的背景色,但是你眼睛看到的并不是jf,其实是rootPane.)
另外 jf.getContentPane()==jf.getRootPane().getContentPane() 上面的比较返回的true 所以你调用jf.getContentPane().add(panel) 其实是把panel添加到rootPane上面了(JFrame.getContentPane()等价JFrame.getRootPane().getContentPane())
这个时候panel和rootPane就不是平级的了
protected JRootPane createRootPane() {
JRootPane rp = new JRootPane();
// NOTE: this uses setOpaque vs LookAndFeel.installProperty as there
// is NO reason for the RootPane not to be opaque. For painting to
// work the contentPane must be opaque, therefor the RootPane can
// also be opaque.
rp.setOpaque(true);
return rp;
}
以上红部分是JFrame类的源代码片段!
示例:
在过去的J2SE版本中,部件(components)不能直接添加到最高级(top level)的Swing容器,这些容器包括:JFrame, JDialog, JWindow, JApplet和JInternalFrame. 例如现在有一个JFrame的instance(实例)命名为aFrame。我们要添加一个命名为aComponent的部件(比如一个JPanel)到JFrame里。以往我们需要调用JFrame的getContentPane()办法。如下:
aFrame.getContentPane().add(aComponent)
在J2SE5.0中,我们可以直接添加部件到最高级的Swing容器,也可以直接在容器内设置布局管理(Layout Manager)和删除部件。这个变化允许我们可以省去调用getContentPane()而直接在容器内应用add(),setLayout()和remove()。然而,我们还是不能忽略了ContentPane,即使我们可能将不会再使用ContentPane来添加部件到容器。先看一个我们以往在J2SE1.4及其以前的版本经常应用到的例子。我们要设置一个JFrame的布局管理而且添加一些部件到该JFrame。查看api关于JFrame的文件可以发现, JFrame从java.awt.Container继承了add()办法. 该add()是用来添加一个部件到JFrame容器. Container类里也包含setLayout()办法, 该setLayout()是用来设置继承者(比如上面的JFrame容器)的布局管理。
下面是一个简单的例子:
import javax.swing.JFrame;import javax.swing.JPanel;import java.awt.GridLayout;import java.awt.Color;public class FrameTest extends JFrame {//注意在1.4及其以前版本中可以编译,但是运行有问题//5.0版本运行正常FrameTest(){super("Test");setBackground(Color.BLACK);//效果1//this.getContentPane().setBackground(Color.BLACK);//效果2setLayout(new GridLayout(6,6,2,2)); // 1.4中问题 1for ( int i=0;i<36; i++){JPanel jPanel = new JPanel();jPanel.setBackground(new Color ((int)(Math.random()*16777215)));add(jPanel); // 1.4中问题 2}setSize(400,400);setVisible(true);}public static void main(String[] args){new FrameTest();}}
运行效果1如下:
这时我们注意到上面输出的JFrame的背景颜色并不是黑色而是白色,也就是说上面的setBackground(Color.BLACK)编译后该JFrame的背景颜色并没有被显示,如果要让JFrame背景颜色为黑色–grid之间颜色为黑色还需要调用getContentPane(),
getContentPane().setBackground(Color.BLACK);
运行效果2如下:
- Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?
- Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?
- Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?
- JFrame.getContentPane().add(pane)与JFrame.add(pane)有什么区别
- java中button背景图片大小设置,JFrame.getContentPane().add(pane)与JFrame.add(pane)区别
- Java中JFrame.getContentPane().add(pane)与JFrame.add(pane)的区别
- getContentPane().add(childcomponent)与setContentPane(pane) 与 组件、容器、布局管理器
- JFrame与getContentPane()
- JFrame的setBackGround与getContentPane().setBackground区别
- java.swing中 真正认识 JFrame 和 getContentPane() 方法
- javax.swing.JFrame
- java中Pane与Panel的区别
- Java--JFrame.add()方法
- JFrame.getContent().add(JLabel Label)
- javax.swing.JFrame中使用jpanel来布局
- javax.swing.JFrame中使用jpanel来布局
- swing中一个Jframe调用另一个Jframe
- JFrame与Frame区别
- codeforces 160A(Twins) Java
- HDFS 2.X对比HDFS1.X 主要是HA—Zookeeper
- 自动修改像素比
- 夏至未至
- LaTeX数学公式
- Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?
- php 乱码, 在头部添加utf-8 怎么加
- Java-判断回文数
- jsonp跨域
- iOS 关键字 static extern const volatile 区别及应用场景
- 2017ZZUACM省赛选拔 聪明的田鼠
- 如何从程序员走向技术管理岗位?
- j加油
- 微信小程序可视化开发工具之动态数据