java程序启动画面

在运行一个大型的应用程序,在程序能正式工作前需要一段时间来进行初始化.通常我们会显示一个等待画面直到程序初始化完成.在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
                      Ant-Version: Apache Ant 1.8.3
                     Created-By: 1.7.0_09-b05 (Oracle Corporation)
                     Class-Path:  
                     X-COMMENT: Main-Class will be added automatically by build
                     SplashScreen-Image: test/SplashScreen.png
                     Main-Class: test.SplashTest


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

 

 

java 代码/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.SplashScreen;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 *
 * @author root
 */
public class SplashTest {

    public static void main(String[] args) {
        new Thread() {
            public void run() {
                try {
                    SplashScreen splash = SplashScreen.getSplashScreen();
                    Graphics2D g = splash.createGraphics();
                    g.setColor(Color.RED);
                    g.drawString("测试文字", 10, 30);
                    splash.update();

                    Thread.sleep(1000);

                    g.setComposite(AlphaComposite.Clear);
                    g.fillRect(0, 0, (int) splash.getSize().getWidth(), (int) splash.getSize().getHeight());
                    splash.setImageURL(SplashTest.class.getResource("/test/SplashScreen.png"));

                    int x = 100, y = 100;
                    String author = "1 2 3 4 5";
                    g.setFont(new Font("TimesRoman", Font.PLAIN, 30));
                    g.setPaintMode();

                    for (int i = 0; i < 5; i++) {
                        g.setColor(new Color(50, 50, 0));
                        g.drawString(author, x + i, y + i - 1);
                        g.setColor(new Color(10, 10, 0));
                        g.drawString(author, x + i - 1, y + i);
                    }
                    g.setColor(Color.red);
                    g.drawString(author, x + 5, y + 5);
                    splash.update();
                    Thread.sleep(1000);


                } catch (Exception ex) {
                    Logger.getLogger(SplashTest.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }.start();


        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }

        JFrame jf = new JFrame("test");
        JButton jb = new JButton("click");
        jf.add(jb);
        jf.setPreferredSize(new Dimension(320, 240));
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
        jf.setVisible(true);
    }
}

  1.   

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


源文地址:http://eastsun.iteye.com/blog/36982


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值