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入门到精通教程
查看: 517|回复: 0

[Swing学习]动画方式弹出Swing窗口

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

    [LV.1]初来乍到

    发表于 2014-11-4 23:55:59 | 显示全部楼层 |阅读模式
    自定义PopupFactory能解决Popup窗口的动画显示,但并不能解决普通窗口如JFrame, Frame, JDialog, Dialog, JWindow和Window的动画显示。

         这在前篇文章已经指明了。这是因为这些窗口并不使用PopupFactory提供的getPopup方法获取窗口对象,它们实际上是AWT窗口,是作为顶层容器存在的,是Swing所有组件的基础。Swing组件依赖于这些窗口提供的图形和事件等环境来绘制自己并传播和处理事件。
       
       
            前面文章的一个评论希望“
        对话框,窗口之类的重型组件的弹出或显示也要有这种效果”,显然这样的窗口就不能再使用自定义PopupFactory来创建了。最直接的方法是继承窗口和对话框来自定义显示过程。但更深入的想一下,这些窗口的动画过程只需要使用窗口的一些公共接口就可以实现,比如setSize、setVisible。这启发了我,其实可以提供类似于PopupFactory那样统一接口类来实现各类型窗口显示的动画。于是写了下面的Invoker类来实现这以功能:
       
      
       
       
         
       

         
       
      



      /**
      * 一个简单的窗口动画显示工具
      * @author William Chen
      */
    public class Invoker implements ActionListener{
         private static final int ANIMATION_INTERVAL=10;
         private static final int ANIMATION_FRAMES=10;
         /**
          * 调用此静态方法显示窗口,可以出现动画效果
          * 被显示的窗口是任何继承自Window的窗口,包括显示模态的对话框
          */
         public static void show(Window w){
             if(w.isVisible())
                 return;
             new Invoker(w).invoke();
         }
         //要被显示的窗口
         private Window window;
         //窗口全部展开时大小
         private Dimension full_size;
         //动画定时器
         private Timer timer;
         //当前动画帧
         private int frameIndex;
         //私有构造函数,不允许直接访问
         private Invoker(Window w){
             //初始化
             window=w;
             full_size=window.getSize();
             timer=new Timer(15, this);
             frameIndex=0;
             window.setSize(0, 0);
         }


         //激活动画过程
         private void invoke(){
      

      
              if(!window.isVisible()){
                 timer.start();
                 window.setVisible(true);
             }
      
         }
         //动画的一帧处理方法
         public void actionPerformed(ActionEvent e) {
             //计算和设置当前帧尺寸
             int w=full_size.width*frameIndex/ANIMATION_FRAMES;
             int h=full_size.height*frameIndex/ANIMATION_FRAMES;
             window.setSize(w, h);
             if(frameIndex==ANIMATION_FRAMES){
                 //最后一帧,停止时钟,释放资源
                 timer.stop();
                 timer=null;
                 window=null;
                 full_size=null;
             }else
                 //前进一帧
                 frameIndex++;
         }
    }
      

          非常简单和直接的想法。唯一需要注意的是invoke方法中timer.start()和window.setVisiable(true)的调用顺序。因为有一些窗口是模态对话框,它们在调用window.setVisible(true)就进入阻塞状态,如果将timer.start()调用放在window.setVisible之后就会启动不了动画进程。整个类的动画的处理方法和前篇文章中处理方法大同小异。
      

      

      

          这个类的编程接口只有一个静态方法:
      

      public static void show(Window w);
      

          调用代码如下:
      

          public static void main(String[] args) {
             ......
             EventQueue.invokeLater(new Runnable() {
                 public void run() {
                     //使用Invoke.show方法动画显示窗口
                     Invoker.show(new SampleFrame());
                 }
             });
         }
      

          下图是使用Invoker写的一个动画显示窗口和对话框的演示:
      
      
      
      
      

          点击上面的两个按钮分别弹出模态和非模态对话框。能用Invoker显示的动画窗口包括所有继承自Window的窗口,包括JFrame, Frame, JDialog, Dialog, JWindow和Window。
      

         
      



      
      
       
       

         
       

         
       
      
    复制代码

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-11-9 06:12 , Processed in 0.408841 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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