`

Swing特效-渐显效果

阅读更多
能不能让Swing控件也有渐隐和渐显的效果呢,答案当然是肯定的。这里也要说明一下Swing这些高级特性的实现机制。Swing里的特效不是靠调用一个方法就可以实现的,而是要我们自己去写这些方法,主要还是重写Swing的public void paint(Graphics g)方法。Swing的一切样式说白了都是利用paint方法“画”上去的,所以说Swing比较慢,当然如果我们考虑Swing主要用来做客户端显示的,稍微慢一点也是可以接受的。

下面说Swing的控件的渐显效果,我想原理还是蛮简单的,不断改变控件的透明度即可。即g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
下面是完整的控件代码,该控件您可以认为是一个类似JPanel的容器:

package com.zakisoft.frame;

import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Timer;


/**
 * @author zakisoft.com
 *
 */
public class ZPanel extends javax.swing.JComponent implements ActionListener {

	private static final long serialVersionUID = 1L;
	private BufferedImage image;

	private static final int ANIMATION_FRAMES = 100;
	private static final int ANIMATION_INTERVAL = 10;
	
	private int frameIndex;
	// 时钟
	private Timer timer;

	public BufferedImage getImage() {
		return image;
	}

	public void setImage(BufferedImage image) {
		this.image = image;
	}

	private int imgWidth;
	private int imgHeight;

	public int getImgWidth() {
		return imgWidth;
	}

	public void setImgWidth(int imgWidth) {
		this.imgWidth = imgWidth;
	}

	public int getImgHeight() {
		return imgHeight;
	}

	public void setImgHeight(int imgHeight) {
		this.imgHeight = imgHeight;
	}

	public ZPanel() {
	}

	public void setImagePath(String imgPath) {
		// 该方法不推荐使用,该方法是懒加载,图像并不加载到内存,当拿图像的宽和高时会返回-1;
		// image = Toolkit.getDefaultToolkit().getImage(imgPath);
		try {
			// 该方法会将图像加载到内存,从而拿到图像的详细信息。
			image = ImageIO.read(new FileInputStream(imgPath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		setImgWidth(image.getWidth(this));
		setImgHeight(image.getHeight(this));
	}

	public void paintComponent(Graphics g) {
		int x = 0;
		int y = 0;
		if (null == image) {
			return;
		}
		g.drawImage(image, x, y, image.getWidth(null), image.getHeight(null),
				null);
	}

	public void paint(Graphics g) {
		if (isAnimating()) {
			// 根据当前帧显示当前透明度的内容组件
			float alpha = (float) frameIndex / (float) ANIMATION_FRAMES;
			Graphics2D g2d = (Graphics2D) g;
			g2d.setComposite(AlphaComposite.getInstance(
					AlphaComposite.SRC_OVER, alpha));
			// Renderer渲染机制
			super.paint(g2d);
		} else {
			// 如果是第一次,启动动画时钟
			frameIndex = 0;
			timer = new Timer(ANIMATION_INTERVAL, this);
			timer.start();
		}
	}

	// 判断当前是否正在进行动画
	private boolean isAnimating() {
		return timer != null && timer.isRunning();
	}

	// 关闭时钟,重新初始化
	private void closeTimer() {
		if (isAnimating()) {
			timer.stop();
			frameIndex = 0;
			timer = null;
		}
	}

	// 动画时钟处理事件
	public void actionPerformed(ActionEvent e) {
		// 前进一帧
		frameIndex++;
		if (frameIndex >= ANIMATION_FRAMES)
			// 最后一帧,关闭动画
			closeTimer();
		else
			// 更新当前一帧
			repaint();
	}
}

我们利用控件的public void paint(Graphics g) 方法,来设置控件的透明度,然后利用super.paint(g2d)方法重绘页面;重绘时系统会自动调用public void actionPerformed(ActionEvent e) 方法,我们在这里来改变控件的透明度,并且判断控件是否加载完毕,加载完毕就停止计时器。

很简单,效果还不错吧,附件是完整的运行代码。按“图片渐显”按钮,可以反复查看效果。

下图是加载时界面:

下图是加载完成界面:


文章地址:http://javapub.iteye.com/blog/759567
1
0
分享到:
评论

相关推荐

    swing-layout-1.0.3

    swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...

    Example002-渐显的窗体.rar

    标题中的"Example002-渐显的窗体.rar"显然指的是一个示例程序,它展示了如何在编程中实现一个窗口逐步显示的效果。这通常涉及到图形用户界面(GUI)的设计和动画效果。在IT领域,这种效果可能通过各种编程语言和库来...

    swing-layout-1.0.4.jar包

    swing-layout-1.0.4.jar是org.jdesktop.layout,org.jdesktop.layout.GroupLayout类的工具jar包

    swing-inspector

    Swing-inspector是一款高效工具,专门用于帮助开发者在Java Swing应用程序中快速定位界面元素对应的源代码,从而提高代码查找和调试的效率。在Java开发领域,Swing是用于构建图形用户界面(GUI)的一个重要库,它...

    swing-layout-1.0.jar

    在Eclipse这样的集成开发环境中,`swing-layout-1.0.jar`是一个非常重要的库文件,它扩展了Swing内置的布局管理器,提供了更灵活的界面设计能力。 Swing布局管理器的基础包括以下几种: 1. FlowLayout:流式布局,...

    SWING 教程 - v1.01

    **SWING 教程 - v1.01** 在Java编程中,Swing是一个用于构建图形用户界面(GUI)的库,它提供了丰富的组件和功能,使得开发者可以创建出跨平台、美观且功能强大的应用程序。Swing是Java Foundation Classes (JFC)的...

    aspect-swing-worker-1.1.jar.zip

    《深入理解Aspect-Swing-Worker-1.1.jar在Java编程中的应用》 在Java开发领域,库文件的使用是提升代码效率、实现特定功能的关键。今天我们将深度探讨"aspect-swing-worker-1.1.jar.zip"这个压缩包,它包含了一个名...

    swing-worker-1.1.jar

    Exceptionin thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/jdesktop/swingworker/SwingWorker ... at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue...

    swing-layout-1.0.4.jar

    swing-layout-1.0.4.jar是java用于图形界面swing开发的jar包

    luke-swing-8.0.0-luke-release.zip

    Lucene索引查看工具 Luke。Luke 是查询LUCENE索引文件的工具, 而且用 Luke 的Search可以做查询。Luke is a handy development and diagnostic to Lucene.

    swing keyboard-master

    Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。在Java中,Swing提供了丰富的组件库,用于创建美观且功能强大的桌面应用程序。"swing keyboard-master"项目是一...

    纯swing编写--no3.keeper小软件

    【纯swing编写--no3.keeper小软件】 在IT领域,Java Swing是一个用于构建桌面应用程序的图形用户界面(GUI)工具包。它属于Java Foundation Classes(JFC)的一部分,提供了丰富的组件库,允许开发者创建美观且功能...

    swing-Java游戏.zip

    swing-Java游戏.zipswing-Java游戏.zipswing-Java游戏.zip swing-Java游戏.zipswing-Java游戏.zipswing-Java游戏.zip swing-Java游戏.zipswing-Java游戏.zipswing-Java游戏.zip swing-Java游戏.zipswing-Java游戏....

    用Spring开Swing程序----DBManager(数据库查看器)

    在本项目中,“用Spring开Swing程序----DBManager(数据库查看器)”是一个结合了Spring框架和Swing GUI工具包的应用,主要用于创建一个数据库管理工具。这个应用允许用户直观地查看、操作数据库,从而简化数据库的...

    swing实例-计算器

    swing实例-计算器,java编程教学资源

    Swing特效的15个例子!!!!

    从网上一个博文上搜集来的一些Swing特效的例子,如xp折叠效果_foldered_pane,鼠标悬停提示_tooltip,玻璃效果闪烁_glassbox,日历组件,环形右键弹出菜单等等.....绝对物超所值! 其中部分例子为jar形式,可直接运行......

    swing substance-6.0.jar 皮肤包.zip

    3. **动画效果**:Substance支持各种动态效果,如按钮按下时的下陷效果、窗口最小化和最大化时的过渡动画等,增强用户交互体验。 4. **组件增强**:Substance扩展了Swing组件的功能,例如,它为JTable提供了更丰富...

    基于java的开发源码-swing-explorer(Swing开发辅助工具).zip

    基于java的开发源码-swing-explorer(Swing开发辅助工具).zip 基于java的开发源码-swing-explorer(Swing开发辅助工具).zip 基于java的开发源码-swing-explorer(Swing开发辅助工具).zip 基于java的开发源码-swing-...

Global site tag (gtag.js) - Google Analytics