您的位置:知识库 » 编程语言

Swing特效-渐显效果

作者: javapub  来源: JavaEye  发布时间: 2010-09-14 21:55  阅读: 1572 次  推荐: 0   原文链接   [收藏]  

  能不能让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)方法,我们在这里来改变控件的透明度,并且判断控件是否加载完毕,加载完毕就停止计时器。 

  下图是加载时界面: 

 

0
0

编程语言热门文章

    编程语言最新文章

      最新新闻

        热门新闻