Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 398|回复: 0

[Swing学习]淡入淡出式显示Swing容器组件

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-4 23:55:56 | 显示全部楼层 |阅读模式
    其实有很多用户界面效果在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的能力就逐步显现了出来了
      


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/4/235556593.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 13:03 , Processed in 0.355873 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表