mayrazhao 2009-07-10
其实有很多用户界面效果在Swing中是相当容易实现的。前面曾谈到过淡入淡出式弹出Swing Popup窗口,其实对于任何Swing容器组件而言都可以实现这一功能。使用Renderer渲染机制,在容器的paint方法中设置图形对象的透明属性,就可以实现Swing容器组件自身和子组件的透明渲染。如果再将这个过程渐变化,就能实现容器显示淡入淡出效果。
本文的演示使用下面几行代码就实现了容器显示的淡入淡出效果:
/**  
 * 淡入淡出式显示内容组件的容器  
 * @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();  
    }  
}