JFrame 移除组件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JFrame 移除组件相关的知识,希望对你有一定的参考价值。

参考技术A 在学习如何向 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 的结构是这样的:

最顶层的 GlassPane 默认是透明的,
关于 GlassPane 这个层次,其实有很多可以利用的技巧,以后我再慢慢告诉大家,
今天说我们的重点:ContentPane
可以看出,这个 ContentPane 就是默认盛放控件的那个层次,
那 ContentPane 在默认的情况下又是什么呢?

我们来看两个方法:

可以明显的看出,默认的 ContentPane 就是一个 JPanel,

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

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

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

以上是关于JFrame 移除组件的主要内容,如果未能解决你的问题,请参考以下文章

移除组件本身

使用导航组件时从 BottomNavigationView 中移除 Badge

无法移除组件并重新绘制

Windows10组件移除

Flutter监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )

被父组件移除的子组件仍然获得存储更改事件