易码技术论坛

 找回密码
 加入易码
搜索
查看: 337784|回复: 7

[教程] JAVA SE6.0中使用SplashScreen类做程序启动画面.

[复制链接]
发表于 2006-12-2 22:22:08 | 显示全部楼层
找不到主函数...
 楼主| 发表于 2006-12-2 22:27:05 | 显示全部楼层
我下了试了下...木问题啊
ls装的是JDK6.0?
如果是用 java -jar Splash.jar试一试
发表于 2006-12-2 22:33:58 | 显示全部楼层
JDK6.0 怨念,便去找来看看...
发表于 2006-12-2 23:28:21 | 显示全部楼层
寒……JDK6.0了?……前天才装的5.0_09......
发表于 2006-12-3 01:47:37 | 显示全部楼层
不过6.0还是RC,装了6.0看了LZ的东东了,不过那两个MM不怎么PP的说~
发表于 2006-12-3 10:53:37 | 显示全部楼层
6.0下了很久了 一直懒得装的说。。。~
发表于 2006-12-5 17:54:29 | 显示全部楼层
up一下~~:)
Eastsun也开blog了呀~~
 楼主| 发表于 2006-12-2 22:09:43 | 显示全部楼层 |阅读模式
  第一次正儿八经的写BLOG...刚开始还觉得蛮有动力,搜了不少资料,等把问题搞清楚了,就不想写了.不过最终还是凑成了一篇
      在运行一个大型的应用程序,在程序能正式工作前需要一段时间来进行初始化.通常我们会显示一个等待画面直到程序初始化完成.在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的使用.   
  1. package SplashTest;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.image.*;
  5. public class Main{
  6.    public static void main(String[] args){
  7.       new Thread(){                                  //用于运行SplashScreen的线程
  8.         public void run(){
  9.            try{
  10.               SplashScreen splash =SplashScreen.getSplashScreen();
  11.               Graphics2D g =splash.createGraphics();
  12.               g.setColor(Color.red);
  13.               g.drawString(splash.getBounds().toString(),10,30);  //SplashScreen在屏幕的位置,大小
  14.               g.drawString(splash.getSize().toString(),10,50);   //SplashScreen的大小
  15.               g.drawString(splash.getImageURL().toString(),10,70);//当前显示的图片
  16.               splash.update();                        //刷新以上内容到屏幕
  17.               Thread.sleep(1000);
  18.               
  19.               //下面的代码是在SplashScreen上显示一个3D效果的字符串
  20.               g.setComposite(AlphaComposite.Clear);                                //1   
  21.               g.fillRect(0,0,(int)splash.getSize().getWidth(),(int)splash.getSize().getHeight());  //2
  22.               splash.setImageURL(Main.class.getResource("/SplashTest/beauty.jpg"));    //更改显示的图片
  23.               
  24.               int x =30, y=100;
  25.               String author ="Made By Eastsun";
  26.               g.setFont(new Font("TimesRoman", Font.PLAIN, 30));
  27.               g.setPaintMode();                                              //3
  28.               for(int i=0;i<5;i++){
  29.                 g.setColor(new Color(200, 200, 0));
  30.                 g.drawString(author, x+i, y+i-1);
  31.                 g.setColor(new Color(100, 100, 0));
  32.                 g.drawString(author, x+i-1, y+i);
  33.               }
  34.               g.setColor(Color.yellow);
  35.               g.drawString(author, x+5, y+5);
  36.               splash.update();
  37.               Thread.sleep(10000);                      //注意,这儿是sleep(10000),但实际上SplashScreen并没有显示10秒   
  38.            }catch(Exception e){
  39.               e.printStackTrace();
  40.            }
  41.         }
  42.       }.start();
  43.       
  44.       try{
  45.         Thread.sleep(3000);                            //这儿决定SplashScreen显示时间长短.                                         
  46.       }catch(Exception e){}                             //对于实际应用程序,这儿对应程序的初始化工作
  47.       JFrame frame =new JFrame("Java SE6 Splash Test");
  48.       frame.setPreferredSize(new Dimension(320,240));
  49.       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  50.       frame.pack();
  51.       frame.setVisible(true);
  52.    }
  53. }
复制代码

      程序很简单,没什么好说的.注意的是注释为(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.

ps:俺的blog...http://eastsun.javaeye.com

源代码.rar

26 KB, 下载次数: 130

本文的源代码

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-19 23:25 , Processed in 0.013430 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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