java吧 关注:1,273,545贴子:12,783,815

【科普】JFrame的层次结构究竟是什么样的,什么又是ContentPane?

只看楼主收藏回复

在学习如何向 JFrame 添加控件时,很多人都会在教科书上看到这样的语句:
getContentPane().add(……);
然后有的人就产生了疑问,为什么要这么写呢?
好像我直接写 add(……); 也可以啊?
的确,现在直接写 add(……); 是可以的,但是在 java 1.4 还是更早的年代,
这一句 getContentPane() 却是必不可少的,
这里我就不得不吐槽一下当年的 Swing 的开发人员,
明明重载一下 JFrame 的 add 方法就能解决的问题,非要我们多写这么一句……
好在后来他们终于醒悟,重载了一下 JFrame 的 addImpl 方法:
protected void addImpl(Component comp, Object constraints, int index)
{
if(isRootPaneCheckingEnabled()) {
getContentPane().add(comp, constraints, index);
}
else {
super.addImpl(comp, constraints, index);
}
}
终于,我们不用再去 getContentPane() 了……
那这个神奇的 ContentPane 究竟是什么呢?


IP属地:江苏1楼2012-11-23 14:35回复
    我们通过两个图来说明一下 JFrame 的层次结构:
    从视觉效果来看(从 View 层来看),一个 JFrame 的结构是这样的:

    可以看出,
    Frame 的最底层是 RootPane,
    然后是 LayeredPane
    再上面就是 ContentPane
    最顶层是 GlassPane
    最顶层的 GlassPane 默认是透明的,
    关于 GlassPane 这个层次,其实有很多可以利用的技巧,以后我再慢慢告诉大家,
    今天说我们的重点:ContentPane
    可以看出,这个 ContentPane 就是默认盛放控件的那个层次,
    那 ContentPane 在默认的情况下又是什么呢?
    我们来看两个方法:
    JFrame 中的 getContentPane:
    public Container getContentPane() {
    return getRootPane().getContentPane();
    }
    JRootPane 中的 createContentPane:
    protected Container createContentPane() {
    JComponent c = new JPanel();
    ……
    ……
    return c;
    }
    可以明显的看出,默认的 ContentPane 就是一个 JPanel,


    IP属地:江苏2楼2012-11-23 14:36
    收起回复
      2025-08-11 19:48:18
      广告
      不感兴趣
      开通SVIP免广告
      现在我们再来看另一张图,从模型的角度来看 JFrame 的层次:

      可以看出,其实 ContentPane 是添加在 LayeredPane 上的一个控件。
      而 LayeredPane 和 GlassPane 是直接添加在 RootPane 上的,
      RootPane 直接添加在 JFrame 上。
      其实你只要记住:
      1、你现在不再需要去 getContentPane(),
      2、ContentPane 默认是一个 JPanel ,
      这两个结论就可以了……


      IP属地:江苏3楼2012-11-23 14:36
      收起回复
        顶起!!


        IP属地:广东来自手机贴吧4楼2012-11-23 14:37
        收起回复
          技术贴,马克,手机不支持马克……


          来自Android客户端5楼2012-11-23 14:38
          收起回复
            几天没见都13级了


            7楼2012-11-23 14:46
            收起回复
              不用吐槽Swing的设计人员,Eclipse GEF 也这么设计, 实际上一个窗口是一层层的decorator堆起来的,比如滚动条什么的,你直接加东西,滚动条就无法工作了,而getContentPane,就可以直接添加到目标控件,很方便的一个实现,你不用关心到底添加到哪个区域。


              IP属地:湖北8楼2012-11-23 14:48
              收起回复


                IP属地:北京9楼2012-11-23 14:48
                收起回复
                  2025-08-11 19:42:18
                  广告
                  不感兴趣
                  开通SVIP免广告
                  。大神啊!


                  IP属地:福建来自iPhone客户端10楼2012-11-23 14:49
                  收起回复
                    技术贴,其实我更想知道,jpanel怎么和jframe一起用!期待下次讲解


                    11楼2012-11-23 14:50
                    收起回复
                      好难啊,不懂帮顶
                      ————来自Nokia E6-00,文艺小青年。


                      来自WindowsPhone客户端14楼2012-11-23 14:58
                      收起回复
                        收藏夹快满了


                        15楼2012-11-23 15:05
                        收起回复
                          其实感觉前边都是水~
                          就后边2句是重点。。。


                          IP属地:吉林16楼2012-11-23 15:34
                          收起回复