Swing容器组件的显示效果

其实有很多用户界面效果在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();  


    }  


}  

相关推荐