美文网首页
JFrame 移除组件

JFrame 移除组件

作者: Alex_1799 | 来源:发表于2018-06-30 19:08 被阅读0次

    在学习如何向 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 究竟是什么呢?
    我们通过两个图来说明一下 JFrame 的层次结构:
    从视觉效果来看(从 View 层来看),一个 JFrame 的结构是这样的:


    image.png
    可以看出,
    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,

    现在我们再来看另一张图,从模型的角度来看 JFrame 的层次:


    image.png

    可以看出,其实 ContentPane 是添加在 LayeredPane 上的一个控件。
    而 LayeredPane 和 GlassPane 是直接添加在 RootPane 上的,
    RootPane 直接添加在 JFrame 上。

    其实你只要记住:
    1、你现在不再需要去 getContentPane(),
    2、ContentPane 默认是一个 JPanel ,
    这两个结论就可以了……


    image

    相关文章

      网友评论

          本文标题:JFrame 移除组件

          本文链接:https://www.haomeiwen.com/subject/ldcxuftx.html