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

目录
相关文章
|
Java C++
做了个Java打包工具,可以双击启动了!
本文介绍了作者日常使用Java和Swing进行开发的经验,以及Java程序分发时遇到的问题,如需要JRE环境。文中列举了几种常见的Java程序打包方法,并对比了各自的优缺点,最后作者结合这些方案,利用Winform开发了一款工具,将Java程序打包成二进制可执行文件,简化了分发流程。
做了个Java打包工具,可以双击启动了!
|
3天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
497 203
|
5天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
658 157
|
11天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
5天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。