zoukankan      html  css  js  c++  java
  • (转载)JAVA SE6.0 中使用SplashScreen

    在运行一个大型的应用程序,在程序能正式工作前需要一段时间来进行初始化.通常我们会显示一个等待画面直到程序初始化完成.在JAVA SE6中提供了一个SplashScreen类让我们能够很方便的实现这个功能.

             SplashScreen类能够在启动程序时在屏幕中央显示一张预先指定的图片或动画(gif),并且在第一个AWT/SWING窗口显示时自动关闭(当然你也可以在这期间自行关闭).使用SplashScreen的最简单的方法不需要写任何代码,只要在运行程序时在命令行加一个参数-splash:imageFile就可以了,比如  java -splash:splash.gif myApp(如果是jar文件:java -splash:splash:splash.gif -jar myApp.jar).是不是很方便啊.

            不过更多的时候我们发布程序时使用的是jar文件,另一方面用户使用时也不会要求他自己会在命令行上加上 -splash参数.所以更常用的方式是在jar包的配置文件里加一行:SplashScreen-Image: splashFileName,象这样:

                            Manifest-Version: 1.0
                            Author: Eastsun
                            Created-By: 1.6.0-beta2 (Sun Microsystems Inc.)
                            SplashScreen-Image: splash.png
                            Main-Class: TestSplash

            这种简单的使用在大多时候已经足用了,不过有时我们希望把欢迎界面做的更完美一些,比如在上面动态显示出当前初始化的进度,或者在上面显示一个动画之类的,这时就需要我们使用SplashScreen提供的一些方法了.下面我们用一个简单的示例来说明SplashScreen的使用.   

    java 代码
    1. package SplashTest;   
    2.   
    3. import javax.swing.*;   
    4. import java.awt.*;   
    5. import java.awt.image.*;   
    6.   
    7. public class Main{   
    8.     public static void main(String[] args){   
    9.         new Thread(){                                                  //用于运行SplashScreen的线程   
    10.             public void run(){   
    11.                 try{   
    12.                     SplashScreen splash =SplashScreen.getSplashScreen();   
    13.                     Graphics2D g =splash.createGraphics();   
    14.                     g.setColor(Color.red);   
    15.                     g.drawString(splash.getBounds().toString(),10,30);  //SplashScreen在屏幕的位置,大小   
    16.                     g.drawString(splash.getSize().toString(),10,50);    //SplashScreen的大小   
    17.                     g.drawString(splash.getImageURL().toString(),10,70);//当前显示的图片   
    18.                     splash.update();                                    //刷新以上内容到屏幕   
    19.                     Thread.sleep(1000);   
    20.                        
    21.                     //下面的代码是在SplashScreen上显示一个3D效果的字符串   
    22.                     g.setComposite(AlphaComposite.Clear);                                                //1        
    23.                     g.fillRect(0,0,(int)splash.getSize().getWidth(),(int)splash.getSize().getHeight());  //2   
    24.                     splash.setImageURL(Main.class.getResource("/SplashTest/beauty.jpg"));      //更改显示的图片   
    25.                        
    26.                     int x =30, y=100;   
    27.                     String author ="Made By Eastsun";   
    28.                     g.setFont(new Font("TimesRoman", Font.PLAIN, 30));   
    29.                     g.setPaintMode();                                                                    //3   
    30.                     for(int i=0;i<5;i++){   
    31.                         g.setColor(new Color(2002000));   
    32.                         g.drawString(author, x+i, y+i-1);   
    33.                         g.setColor(new Color(1001000));   
    34.                         g.drawString(author, x+i-1, y+i);   
    35.                     }   
    36.                     g.setColor(Color.yellow);   
    37.                     g.drawString(author, x+5, y+5);   
    38.                     splash.update();   
    39.                     Thread.sleep(10000);                                //注意,这儿是sleep(10000),但实际上SplashScreen并没有显示10秒       
    40.                 }catch(Exception e){   
    41.                     e.printStackTrace();   
    42.                 }   
    43.             }   
    44.         }.start();   
    45.            
    46.         try{   
    47.             Thread.sleep(3000);                                         //这儿决定SplashScreen显示时间长短.                                                                
    48.         }catch(Exception e){}                                           //对于实际应用程序,这儿对应程序的初始化工作   
    49.         JFrame frame =new JFrame("Java SE6 Splash Test");   
    50.         frame.setPreferredSize(new Dimension(320,240));   
    51.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    52.         frame.pack();   
    53.         frame.setVisible(true);   
    54.     }   
    55. }   
    56.   

            程序很简单,没什么好说的.注意的是注释为(1,2,3)的三条语句起的作用是把第一次画的那些字符串清除掉.

            嗯,这儿简单说明下原理:SplashScreen实际上可以分为两层,一层是你指定的那个Image图象(也可以由SplashScreen.setImageURL(URL)来指定),它一开始就显示出来;另一层是个BufferedImage,由SplanshScreen.createGraphics得到的Graphics2D对象实际上调用的是BufferedImage.createGraphics(),所以操作g做的图都在这个BufferedImage上,当调用SplashScreen.update()的时候,就会使用AlphaComposite.SrcOver规则将BufferedImage绘制到Image上去.所以当使用setImageURL()去换了图象之后,你会发现即使什么也不画,调用update也会把之前画的图形显现出来.

           晤,还有几点注意的地方:

                  1.SplashScreen不能使用构造函数来实例化,只能通过静态方法getSplashScreen()来获得SplashScreen对象

                  2.在获的SplashScreen对象的时候必须保证你已经以某种方式(命令行或在jar里的配置文件中)指定了一副图像作为启动画面,否则getSplashScreen返回的是个null.

  • 相关阅读:
    基础算法(C#)
    Mac系统Docker安装Redis
    Mac系统Docker安装jenkins
    设计模式-缓存驻留模式
    设计模式列表
    vs问题---...inDebugJns.Gaea.dll”标记为系统必备组件,必须对其进行强签名。
    vs问题--------------标记为系统必备组建
    Excel--------Excel实现数据对比
    IIS--------问题解决(.net开发中localhost可以访问,本地ip不可以)
    .NET--------枚举扩展方法(枚举转list,获取枚举描述)
  • 原文地址:https://www.cnblogs.com/greywolf/p/2347117.html
Copyright © 2011-2022 走看看