首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 笔记本电脑 | 北大青鸟 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> J2EE >> J2ee核心 >> 正文

淡入淡出式显示Swing容器组件

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

/**
 * 淡入淡出式显示内容组件的容器
 * @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();
    }
}
 
 

    将GlassBox类作为JFrame的ContentPane就能实现窗口内容显示的淡入淡出效果。GlassBox更常见的使用方式是作为普通容器,放在应用程序的任何地方。本文附带的演示程序是将GlassBox是作为普通容器加入JFrame的ContentPane内的。下面是程序更新界面时的GlassBox动画效果的截图:

    Swing灵活强大的扩展和自定义功能得益于其优秀的模型和架构设计。如果程序是仅局限于用几个Label和Button等堆砌起来的简单应用,你很难体会到Swing的优点,反而会因为它的灵活复杂觉得它不如SWT等编写简单。然而在你面对现实应用中的复杂、灵活多变的界面需求时,Swing的能力就逐步显现了出来了。

    演示源码下载

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·Oracle外键及外键约束修改行为
 ·开源软件测试工具学习专题
 ·JSP Web开发 入门基础到高手进阶教程
 ·JavaFX—是Java桌面的新希望么?
 ·安全至上 .NET开发安全策略
 ·测试用例设计之道-测试用例学习专题
 ·面向Java开发人员的Scala指南
 ·Java设计模式之实例详解
 ·Oracle数据库11g 面向DBA和开发人员的重要新特性
 ·桌面应用软件编程 J2SE技术详解
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航