JFC系列1之添加背景图片

简介:   用JAVA写桌面程序,难免不了想写出美观的界面,这样一来为面板添加背景图片就少不了了。   添加背景图片,一般有两种方式(我指的是我所认识到的,如还有其它方式,请补充,不甚感激)。一是在JFrame中添加背景图片,二是在JPanel中添加背景图片。

  用JAVA写桌面程序,难免不了想写出美观的界面,这样一来为面板添加背景图片就少不了了。

  添加背景图片,一般有两种方式(我指的是我所认识到的,如还有其它方式,请补充,不甚感激)。一是在JFrame中添加背景图片,二是在JPanel中添加背景图片。

  先说JFrame的情况。JFrame在ContentPane(可使用getContentPane方法得到)之下还有一层Panel,即LayerPane。这一层Panel一般我们不会使用到它。所以可以将图片加载到这里。其中一个思路是,使用指定的图像new一个JLabel,然后把这个JLabel添加到LayerPane中。完成之后,由于swing中的Panel默认都是不透明的,所以我们还需要对其之上的面板设置为透明,调用的方法是其之上Panel的setOpaque方法,参数为false。代码如下:

 

/** * 设置 JFrame 对象背景。 * * 本方法对内容面板设置了透明属性,如果窗体中调用了setContentPane(), * 则本方法必须在其之后调用,以保证该属性有效。如果使用add(JPanel),则必须对 * 每个JPanel调用其setOpaque(false)方法,以使背景图片显示出来。 * * @param frame 将要设置的窗体对象 * @param img 作为背景的图片 */ public static void setBackgroundImage(JFrame frame, ImageIcon img) { JLabel imgLabel = new JLabel(img); imgLabel.setBounds(0, 0, img.getIconWidth(), img.getIconHeight()); // 下面函数的参数必须为Integer对象 frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE)); Container cp = frame.getContentPane(); ((JPanel)cp).setOpaque(false); // 设置内容面板透明,使图片显示出来 }

  注意,如果在写代码中时有多个Panel(JPanel继承自Panel)添加到JFrame中时,需要对每个Panel都调用setOpaque(false)。如果只有一个Panel添加,则可以其之后调用该方法。

 

  另一种情况是对JPanel添加背景图片,这种情况可用于当我们的JFrame有多个JPanel而又必须对每个JPanel设置不同的图片时。对此可以写一个ImageJPanel,并继承JPanel,然后重写其中的paintComponent(Graphics g)方法,在方法中绘制图片。注意重写时不要写错,建议查JAVA的API文档,然后从上面复制。实现代码如下:

/* * @(#)ImageJPanel.java 0.1 2011-6-21 * Copyright 2006 DiaoxianSoft Development Team. All rights reserved. * DiaoxianSoft PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package easyJFC.demo; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Image; import java.awt.LayoutManager; import javax.swing.JPanel; /** * 带有图片背景的JPanel,图片起始位置为(0,0)。 * * Copyright: Copyright (c) * Company: DiaoxianSoft development team * @author Geek_Soledad * @creation date 2011-6-21 下午03:46:29 * @version 0.1 */ public class ImageJPanel extends JPanel { private static final long serialVersionUID = 1940032010486975040L; Image image; /** * 创建具有双缓冲和流布局的新 ImageJPanel。 */ public ImageJPanel() { super(); } /** * 创建具有双缓冲和流布局及指定背景图片的新 ImageJPanel。 * * @param image 指定的背景图片 */ public ImageJPanel(Image image) { super(); this.image = image; } /** * 创建具有指定的布局及缓冲策略的新ImageJPanel。 * * @param layout 要使用的LayoutManager * @param isDoubleBuffered boolean 值, true 表示双缓冲,双缓冲使用更多内存 * 空间实现快速、无闪烁的更新 */ public ImageJPanel(LayoutManager layout, boolean isDoubleBuffered) { super(layout, isDoubleBuffered); } /** * 创建具有指定布局管理器的新缓冲 ImageJPanel * * @param layout the LayoutManager to use */ public ImageJPanel(LayoutManager layout) { super(layout, true); } /** * 创建具有 FlowLayout 和指定缓冲策略的新 ImageJPanel。 * 如果 isDoubleBuffered 为 true,则 JPanel 将使用双缓冲。 * * @param isDoubleBuffered boolean 值,true 表示双缓冲, * 双缓冲使用更多内存空间实现快速、无闪烁的更新 */ public ImageJPanel(boolean isDoubleBuffered) { super(new FlowLayout(), isDoubleBuffered); } /** * 返回此组件的背景图片 * * @return image 此组件的背景图片 */ public Image getImage() { return image; } /** * 设置此组件的背景图片 * * @param image Image 对象 */ public void setImage(Image image) { this.image = image; } /* 重写父类的paintComponent方法,绘制背景图片。 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) */ protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, null); } }

 

由于JPanel中本身含有多个构造方法,添加了Image成员变量之后,要写出通用版的ImageJPanel可能需要组合参数写出更多的构造方法,显得很冗余。因此在这里对其仅作为Demo给出,到时自己参照即可。

  以上添加背景图片的两种情况,均已收录在我的diaoxianSoft中的easyJFC包中。此包暂未完善,亦未做正规测试,不知其有多大通用性,仅作为我个人的私有包,在自己写代码中使用。

  JFC系列将分享一些常见但又让我们这些新手头疼的问题的解决方法,希望大家继续关注,也希望大家一起分享自己的成果。

目录
相关文章
|
前端开发
CSS:实现background-image背景图片全屏铺满自适应
CSS:实现background-image背景图片全屏铺满自适应
2275 0
|
2月前
设置表格的背景颜色和背景图片
设置表格的背景颜色和背景图片
28 10
|
6月前
背景图像
【5月更文挑战第3天】背景图像 。
88 9
|
6月前
背景图像
背景图像。
170 3
|
前端开发
【CSS】background-image背景图片全屏铺满自适应
【CSS】background-image背景图片全屏铺满自适应
150 0
|
XML Java API
一个超简单的渐变平行四边形进度条
这个自定义View,其实就是一个简单的进度条,无非就是平行四边形形状的,加了渐变以及状态颜色的切换。
130 0
|
容器
背景图的设置
背景图的设置
155 0
|
前端开发 开发者
背景图像| 学习笔记
快速学习背景图像。
背景图像| 学习笔记
平铺文理+拉伸按钮图片
平铺文理+拉伸按钮图片
79 0
|
C# 小程序
给图片加上阴影效果
原文:给图片加上阴影效果 今天写一个小程序有一个给图片加上阴影的需求,记得WPF的Effect中就有阴影特效,就打算用它了。代码如下:     using (var imageStreamSource = File.
1213 0