本文实例讲述了java Swing实现窗体添加背景图片的2种方法。分享给大家供大家参考,具体如下:

在美化程序时,常常需要在窗体上添加背景图片。通过搜索和测试,发现了2种有效方式。下面分别介绍。

1. 利用JLabel加载图片

利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体。这是一个很取巧的办法,代码非常简单,如下所示。

JLabel lbBg = new JLabel(imageIcon);

lbBg.setBounds(0, 0, frameSize.width, frameSize.height);

this.getContentPane().add(lbBg);

然而这种方法有几个要注意的点:

(1)不能使用布局管理器

此时你需要将布局管理器设置为null,然后精确控制所有控件的大小和位置。否则,JLabel无法完整覆盖窗体。

(2)应当先添加背景JLabel,再添加其它控件。否则其它控件将被JLabel所遮挡(为什么不是后添加的遮挡先添加的?)。

(3)由于控件及窗体的尺寸需要手动控制,因此无法对背景图片进行缩放。

2. 重载JPanel的paintComponent(Graphics g)方法

通过重载该方法,在JPanel的绘制阶段将指定图片绘制上去即可。由于背景是绘制出来的,因此不会对布局有任何影响。

示例代码如下:

@Override

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(image, 0, 0, d.width, d.height, this);

MainFrame.instance().repaint();

}

下面是一个完整的demo。

package frame;

import java.awt.Dimension;

imp编程客栈public ImagePanel(Dimension d, Image image) {

super();

this.d = d;

this.image = image;

}

@Override

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(image, 0, 0, d.width, d.height, this);

MainFrame.instance().repaint();

}

}

Dimension frameSize = new Dimension(500, 300);

ImageIcon imageIcon = new ImageIcon(this.getClass().getResource(

"/images/bg.jpg"));

public ImageFrame() {

// 设置窗体属性

setSize(frameSize);

setLocationRelativeTo(null);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setIconImage(imageIcon.getImage());

setUndecorated(true);

}

public void addImageByJLable() {

setLayout(null);

// 设置背景

JLabel lbBg = new JLabel(imageIcon);

lbBg.setBounds(0, 0, frameSize.width, frameSize.height);

this.getContentPane().add(lbBg);

addComponents();

setVisible(true);

}

public void addImageByRepaint() {

ImagePanel imagePanel = new ImagePanel(frameSize, imageIcon.getImage());

setContentPane(imagePanel);

addComponents();

setVisible(true);

}

private void addComponents() {

JButton btn1 = new JButton("haha");

btn1.setBounds(10, 20, 60, 30);

this.getContentPane().add(btn1);

JTextField jtf = new JTextField("22222222222");

jtf.setBounds(200, 100, 80, 30);

this.getContentPane().add(jtf);

http://www.cppcns.com }

public static void main(String[] args) {

// TODO Auto-generated method stub

ImageFrame imageFrame = new ImageFrame();

// imageFrame.addImageByJLable();

imageFrame.addImageByRepaint();

}

}

运行效果如下:

图1 使用JLabel加载图片效果

图1可见,使用JLabel时,由于未图片尺寸与窗体尺寸不一致,导致图片只显示出一部分;且有一个控件被遮挡了。注意:通过精细设置尺寸和添加控件顺序,可以达到较为满意的效果的。

图2 使用重绘方式加载图片

图2可见,不需要可以设置匹配尺寸和控件的添加顺序,即可得到比较满意的效果。

补充说明:Swing 重绘 repaint,updateUI区别

repaint

public void repaint()重绘此组件。

如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。

注:有关 AWT 和 Swing 所用绘制机制的更多信息,包括如何编写最高效的绘制代码的信息 。

updateUI

public void updateUI()UIManager 发出的关于 L&F 已经更改的通知。用 UIManager 的最新版本替换当前的 UI 对象。覆盖: 类 JComponent 中的 updateUI另请参见: JComponent.updateUI()

可能大家都试过在swing的事件监听中动态添加组件,但是JFrame却不会动态显示,http://www.cppcns.com只有变大变小(实际是重画了)才会显示。repaint,updateUI可以,用validate发现也可以。

API中对repaint()方法是这样描述的,调度完当前所有未完成的事件后重新绘制该组件,所以repaint方法不总是马上执行。

package awtDemo;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

@SuppressWarnings("serial")

public class Ss extends JFrame {

Container con = this.getContentPane();

JButton jb1 = new JButton("jb1");

JButton jb2 = new JButton("jb2");

JLabel jl1 = new JLabel("jl1");

FlowLayout gly = new FlowLayout();

JPanel jp = new JPanel(gly);

public Ss() {

con.add(jp);

jp.add(jb1);

jp.add(jb2);

MyListener ml = new MyLiwww.cppcns.comstener();

jb1.addMouseListener(ml);

this.setSize(300, 200);

this.setVisible(true);

}

private class MyListener extends MouseAdapter {

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

try {

JButton jb3 = new JButton("jb3");

jp.add(jb3);

// jp.updateUI();//可以正常显示

jp.repaint();//API中对repaint()方法是这样描述的,调度完当前所有未完成的事件后重新绘制该组件,repaint方法不总是马上执行,所以只有调整大小才可以显示。

//主要就是下面的invalidate和validate

//当然,用jp来invalidate和validatae也是可以的

// jp.invalidate();

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

public static void main(String s[]) {

Ss sss = new Ss();

sss.setVisible(true);

}

}

swing重绘主要有四个关键方法:paint(),repaint(),revalidate(),paintImmediately();

而进行绘制时后它会依次调用update(),paint(),paintComponent(),paintBorder(),paintChildren()进行绘制;

那么repaint()方法为什么会延时呢?

调用repaint()会导致一个区域被增加到重绘列表队列中,且被预定重绘。产生一个防止到系统事件队列中的请求,

一旦该请求被处理,内部工具自动毁掉组件的paintImmediately()方法。然后该方法立即执行绘制;

也就是说通常情况下repaint()它是不会立即执行的,调用它后会有一个等待处理的过程。但repaint比较高效,会推迟实际的绘制并将多余的请求压缩到单个 paint 调用中。

所以如何解决它的repaint()延时问题呢?

1.让它立即执行:使用paintImmediately()。

2.使用SwingUtilities工具类中的invokeLater(Runnable doRun)方法;把你要在repaint()后执行的操作写在要执行的线程中;(它会把这个方法也加入到java内部事件队列中,它排在repaint()之后,所以一般情况下,它是等repaint()执行完之后才会执行,虽然这样达到效果,但并不理想);

更多关于java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

本文标题: Java Swing实现窗体添加背景图片的2种方法详解

本文地址: http://www.cppcns.com/ruanjian/java/211061.html

java 窗体添加背景图片_Java Swing实现窗体添加背景图片的2种方法详解相关推荐

  1. java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...

  2. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  3. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  4. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  5. java构建json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  6. eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...

  7. webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...

    文档从网络中收集,已重新整理排版 .word 版本可编辑 . 欢迎下载支持 . 1 word 版本可编辑 . 欢迎下载支持 . 解决在 Web.config 或 App.config 中添 加自定义配 ...

  8. java android消息推送_Android中使用socket通信实现消息推送的方法详解

    原理最近用socket写了一个消息推送的demo,在这里和大家分享一下. 主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ. 效果图: 原理: ...

  9. 【ArcGIS风暴】ArcGIS添加超链接的两种方法详解

    文章目录 1. 在识别对话框中添加超链接 2. 利用属性字段添加超链接 在ArcGIS中,可以很方便的设置文档超链接和URL超链接,设置完成后,只需要点击某个图斑就可以跳到指定的地址.本文详细讲解Ar ...

最新文章

  1. java哈夫曼编码与译码_哈夫曼编码与译码
  2. python笔试题奥特曼打怪兽_python笔试做错的题目
  3. 操作系统-南京大学(蒋岩炎)课程--操作系统上的程序
  4. 艾伟也谈项目管理,项目做完了,总结一下
  5. unity3d显示c4d材质_C4D小白最常踩的9个坑,看看你中招了没?
  6. 4.odoo13的学习(odoo中的xml)
  7. 面向对象开发方法概述
  8. iOS如何检测app从后台调回前台
  9. mac 配置apache
  10. 未来互联网+大数据时代,DT革命互联网大数据应用简析
  11. 计算机桌面图标有小锁如何去掉,去掉电脑桌面图标小黄锁的两种方法
  12. kettle json input组件 Unable to access your JSON data
  13. 阿里云备案一般要多久时间?快速通过阿里云APP进行域名备案方法
  14. 淘宝评价计分规则讲解
  15. rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
  16. 几何学观止(代数几何部分)
  17. 华电源全年空调负荷计算及分析软件
  18. unreal 顶点法线与 面法线
  19. oracle trunc年,使用Oracle trunc 来指定精确的年月日时分秒
  20. excel中横排数据变竖排数据拟合

热门文章

  1. 蓝牙基础知识进阶——Link Manager通用规则介绍
  2. JS笔记:实现网页税收表
  3. java基于quasar实现协程池
  4. Android 关于佳博和汉印蓝牙热敏打印机开发,android面试必看书籍
  5. curl unmatched close brace/bracket 处理
  6. 重磅|云迹科技获金茂资本、携程集团、光控众盈,海银资本联合投资...
  7. C语言将0xea转换为字符ea,eA第10章 c语言程序设计初步.ppt
  8. 高分辨率屏幕下vm安装xp的解决方案
  9. 共享新风机未来家居生活必备品新鲜空气齐分享
  10. 【2015NOIP普及组】T4:推销员 试题解析