关于Swing中JFrame等顶级容器的层次还有设置背景的方式

Posted 汪神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Swing中JFrame等顶级容器的层次还有设置背景的方式相关的知识,希望对你有一定的参考价值。

资料来自:http://blog.csdn.net/qq_32006373/article/details/49659129

http://yuncode.net/code/c_5196327caac3917

在做一个Java大作业,做了一个登录界面后觉得太单调,于是想说加个背景。先是直接弄了个ImageIcon,然后改成Image,再直接用网上的一个重写paint()的方法来设置背景,成功了,但是却发现component都被覆盖掉了。于是开始百度有关JFrame等容器的层次问题。

从视觉效果上看,JFrame的结构是这样的:

可以看出,
Frame 的最底层是 RootPane,
然后是 LayeredPane
再上面就是 ContentPane
最顶层是 GlassPane

最顶层的 GlassPane 默认是透明的,而这个ContentPane,就是我们平时用来添加控件的方法,现在来说说这个ContentPane

ContentPane默认是不透明的,完整的添加控件的方法是:

frame.getContentPane.add(...);

现在简写成frame.add(...);

也可以说contentPane就是个放在 LayeredPane 上的一个JPanel。

所以让我们从模型的角度来看看JFrame的层次:

 

现在来讲讲如何搞个背景:

首先还是要了解框架JFrame中的层次结构。
JFrame中的层次分布及相对关系是:
最底层是:JRootPane;
第二层是:JlayerPane,这层上面包含一层ContentPane(默认不透明),也正是我们常说的内容面板。
所以一般我们拖放的控件就是在ContentPane层上。;
最上层就是:GlassPane(默认是透明的);
 
然后这里介绍一个方法:
原理:
我们把图片放置在第二层:JlayerPane容器上(利用JLabel来放),然后让最上层的
ContentPane透明,这样就实现了背景的设置。
 
来看代码:
JPanel jpanelOfFrame=(JPanel)this.getContentPane();//拿到ContentPane,JPanel有设置透明的方法

//设置背景图片的部分
    String imageUrl = "src/image/f0f600978623446f8ae2d189d3ac0fdf.jpg";//背景图路径
    ImageIcon icon = new ImageIcon(imageUrl);
    JLabel labelBackground = new JLabel(icon);

  labelBackground.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());//设置这个label使得图片刚好充满标签
    this.getLayeredPane().add(labelBackground,new Integer(Integer.MIN_VALUE));//this就是JFrame
   jpanelOfFrame.setOpaque(false);//设置contentpane为透明

 

以上是关于关于Swing中JFrame等顶级容器的层次还有设置背景的方式的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记7.1.1 初探Swing世界 - Swing顶级容器

JPanel与JFrame有啥关系 与不同的

形象解释Swing中顶级容器和中间容器中各个类的意思(最好有实例图片)

关于 Java Swing 中组件类的继承层次结构的说明?

Java——其他容器

第十一周课程总结