启动画面是现代图形界面的应用程序里一个标准组成部分。它的主要用途就是告诉用户:应用程序正在启动。显示一个精致的和看起来专业的启动画面的应用程序可吸引用户的注意并且让用户知道应用程序正在启动中。此外,启动画面还可提供行情信息。有时候还是由于法律上的原因:展现版权信息,第三方的标志以及其他信息。
使用JAVA基本类和Swing(JFC/Swing)或者AWT来创建为JAVA应用程序创建启动画面。然而启动画面仅是用来告诉用户程序正在启动中,所以启动画面从弹出到应用程序启动完成的这段时间要尽量短。在弹出启动画面前,应用程序需要装载和初始化JAVA虚拟机、AWT通常是SWING以及应用程序所需要的库文件。直到现在,基于JAVA的启动画面的停留时间要比预期的短。
JAVA平台标准版本6,代号为Mustang,提供了解决:可让启动画面更早地出来,甚至是在虚拟机启动前。现在,JAVA应用程序启动器能为一个图像编码并且将它显示在一个简单的没有任何装饰的窗口里(如图1)
注意:为了运行本文中的代码,需要下载与安装Mustang[https://mustang.dev.java.net/]
用清单文件里的一个选项可让以JAR压缩包形式的应用程序显示一个启动画面。其他类型的程序通过命令行选项来做到。你可用桌面快捷方式或者脚本来提供命令行选项给JAVA应用程序启动器。启动画面上可显示GIF、PNG或者是JPEG的透明、半透明和动画的图象。
有两种途径来显示本机启动画面:
假如程序是由快捷方式或是命令行启动的,那么用 -splash参数:JAVA应用程序用来显示启动画面的选项:
java -splash:filename.gif?http://www.xvna.com SplashTest
如果程序是以JAR形式打包的,可在清单文件里用SplashScreen-Image选项来显示启动画面。把图象也打包在JAR里并且在选项里指明图象路径。比如,在mainfest.mf文件里使用如下代码:
Manifest-Version: 1.0
Main-Class: SplashTest
SplashScreen-Image: filename.gif?http://www.xvna.com
命令行的形式要优先于清单文件里的设置。
这个特性很容易使用。多数情况下,你所要做的就是给出图象和启动选项。启动画面在第一个AWT或是SWING窗口显示后会自动关闭。
在某些情形下,可能要在启动画面上显示另外一些动态信息。SplashScreen类可能被用来关闭启动画面、更换启动画面里的图象、获取图象位置或者大小以及绘制启动画面。这个类不能用来创建启动画面。应该用命令行选项或者是清单文件里的选项来实现启动画面。
此外,SplashScreen类不可实例化。仅有此类的一个实例可存在,可通过静态方法getSplashScreen()来获得。如果应用程序既不以命令行也不以清单文件选项来创建启动画面的话,那么getSplashScreen()方法返回null.
典型情况是,启动画面显示在屏幕上并且在画面上还显示些其他东西,比如进度指示。启动画面窗口有个alpha通道的覆盖面,可通过通常的Graphics或Graphics2D接口来访问这个覆盖面。
如下代码示范了如何第一次获取SplashScreen对象,以及如何通过getGrpahics()方法来获取图形句柄。接下来,得到启动画面的大小,假如你已经在画面上绘制了其他内容了,如何来清除图象。设置AlphaComposite.Clear 复合模式,在整个启动画面上绘制矩形。恢复绘制模式以及绘制你想要的内容。最后,调用update()方法来显示你所绘制的内容。
SplashScreen splash = SplashScreen.getSplashScreen();
Graphics2D g = (Graphics2D)splash.getGraphics();
Dimension size = splash.getDimension();
g.setComposite(AlphaComposite.Clear);
g.fillRect(0, 0, size.width, size.height);
g.setPaintMode();
同样,也许想以一个AWT或SWING窗口来替代启动画面:
SplashScreen splash = SplashScreen.getSplashScreen();
// Obtain the splash-screen bounds.
Rectangle splashBounds = splash.getBounds();
给你看看新的在与指定splashBounds一样的位置上手工代码出来的启动窗口。原先的启动窗口自动关闭。
通过调用setImageURL方法来更换启动画面上的图象。如果想在第一个AWT或者SWING窗口显示前(少数情况下AWT或SWING不被图形界面应用程序所使用)就关闭启动画面,那么可调用SplashScreen.close方法。
下面给出一个程序来举例说明启动画面如何工作:
import java.awt.*;
import java.awt.event.*;
public class SplashTest extends Frame implements ActionListener {
static void renderSplashFrame(Graphics2D g, int frame) {
final String[] comps = {"foo", "bar", "baz"};
g.setComposite(AlphaComposite.Clear);
g.fillRect(130,250,280,40);
g.setPaintMode();
g.setColor(Color.BLACK);
g.drawString("Loading "+comps[(frame5)%3]+"...", 130, 260);
g.fillRect(130,270,(frame*10)%280,20);
}
public SplashTest() {
super("SplashScreen demo");
setSize(500, 300);
setLayout(new BorderLayout());
Menu m1 = new Menu("File");
MenuItem mi1 = new MenuItem("Exit");
m1.add(mi1);
mi1.addActionListener(this);
MenuBar mb = new MenuBar();
setMenuBar(mb);
mb.add(m1);
final SplashScreen splash = SplashScreen.getSplashScreen();
if (splash == null) {
System.out.println("SplashScreen.getSplashScreen() returned null");
return;
}
Graphics2D g = (Graphics2D)splash.getGraphics();
if (g == null) {
System.out.println("g is null");
return;
}
for(int i=0; i<100; i++) {
renderSplashFrame(g, i);
splash.update();
try {
Thread.sleep(200);
}
catch(InterruptedException e) {
}
}
splash.close();
setVisible(true);
toFront();
}
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
public static void main (String args[]) {
SplashTest test = new SplashTest();
}
}
注意:getGraphics 为给启动画面上覆盖用的图象创建了一个图形上下文(如同Graphics对象),这样就可在启动画面上进行绘制。不同于直接在主画面上进行绘制,绘制工作实际上是在主图象之上的图象以alpha混合方式进行的。同时也请注意:在覆盖面图象上的绘制不必更新启动画面窗口上的内容。如过想让启动创面窗口立即更新的话,只需要在SpalshScreen上调用update()方法.