淡入淡出式显示Swing容器组件(转)

       转自:http://blog.sina.com.cn/swingjava
       淡入淡出式弹出Swing Popup窗口,其实对于任何Swing容器组件而言都可以实现这一功能。使用Renderer渲染机制,在容器的paint方法中设置图形对象的透明属性,就可以实现容器组件自身和子组件的透明渲染。如果再将这个过程渐变化,就能实现容器显示淡入淡出效果。

/**
* 淡入淡出式显示内容组件的容器
*
* 将GlassBox类作为JFrame的ContentPane就能实现窗口内容显示的淡入淡出效果。
* GlassBox更常见的使用方式是作为普通容器,放在应用程序的任何地方。本文附带的演  * 示程序是将GlassBox是作为普通容器加入JFrame的ContentPane内的。
*
@author William Chen
*/

public class GlassBox extends JComponent implements ActionListener{
//常数定义
private static final int ANIMATION_FRAMES=50;
private static final int ANIMATION_INTERVAL=10;
//帧索引
private int frameIndex;
//时钟
private Timer timer;

/** Creates a new instance of GlassBox */
public GlassBox() {
}



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();
}

}

posted on 2007-08-20 20:07 Reg 阅读(606) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(1)

随笔档案

相册

朋友们的链接

经常能找到我的地方..

搜索

最新评论

阅读排行榜

评论排行榜