关于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为透明
时间: 2024-10-16 10:26:51

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

获取res/values/color中色值的方法,给view设置背景

我们一般会把界面上展示的颜色抽取到res/values/color中,这样方便的获取,也方便同意管理. 那么我们怎样获取color文件中的色值,并且给我iview设置背景的颜色呢. 第一种: 如果你在color中是这样写的,<color name="item1">#eed776</color> 那么在给view色值背景的时候,应该这样获取 view.setBackgroundColor(context.getResources().getColor(R.colo

第二节 Java Swing中的基本容器:JFrame

第二节 基本容器:JFrame 如果要使用Swing创建一个窗口,则直接使用JFrame即可,此类事Component类的子类,常用方法如下: 小试牛刀 创建一个简单的窗口 import java.awt.*; import java.io.*; import javax.swing.*; public class JavaSwingTest { public static void main(String args[]) throws IOException{ test1(); } //创建一

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

Swing中使用UIManager批量自定义单一JComponent组件默认属性

最近在研究Swing,被它的复杂性气的快吐血了,刚才本打算把JFrame的背景色换成白底,结果发现事情没想象中那么顺利,调用setBackground完全没有效果,猛然醒悟到JPanel本身是带不透明底色的,事情一下子变得复杂起来了,因为即便最简单的窗口布局,也是嵌套了若干层JPanel.JSplitPane等容器的,一层遮盖一层,而要想统一改成白底的话,那得一个个改代码,或者用复杂的遍历算法... 百度上寻觅了一下,发现一个老去已久的帖子有提及到使用UIManager来批量更改默认值的,例如:

swing中的分层

swing中的分层 摘自:https://blog.csdn.net/levelmini/article/details/26692205 2014年05月23日 12:42:56 阅读数:1244 今天在练习swing相关的内容.突然想到,html中的CSS可以控制分层,windows中的纸牌也是按层显示的,java也肯定有了.看了半天API没找到控制层的方法,在网上倒是找到不少分层显示的例子,但是按照例子练习的时候结果总是不理想,总有各种小瑕疵,完全不知道是怎么回事.再次百度的时候发现了关于

JFrame包含的容器(JRootPane)

JFrame对象创建后,此对象包含JRootPane类型的容器.JRootPane 下有GlassPane,  和  LayeredPane,LayeredPane下又有ContentPane ,   Menu Bar. 包含结构如下: JRootPane              --Glass Pane              --Layered Pane                 --Content Pane                 --Menu Bar 由上面的结构树,我

【Swing】理解Swing中的事件与线程

talk is cheap , show me the code. Swing中的事件 事件驱动 所有的GUI程序都是事件驱动的.Swing当然也是. GUI程序不同于Command Line程序,一个很大的区别是程序执行的驱动条件:命令行程序是接受用户输入的文本参数,对命令解析,然后通过类似switch的选择来执行不同的功能模块.而GUI程 序就不一样了.GUI程序由界面元素组成,如Button,CheckBox,TextArea,等等.用户操作不同的组件,就会引发不同的事件,然后, 程序编写

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中

Java Swing中的SwingWorker

Swing中的SwingWorker主要是用来执行比较耗时的任务. Java doc文档中中包含了一些简单的例子. An abstract class to perform lengthy GUI-interaction tasks in a background thread. Several background threads can be used to execute such tasks. However, the exact strategy of choosing a threa