王朝网络
分享
 
 
 

应用Mustang里新的启动画面功能

王朝other·作者佚名  2008-05-31
宽屏版  字体: |||超大  

启动画面是现代图形界面的应用程序里一个标准组成部分。它的主要用途就是告诉用户:应用程序正在启动。显示一个精致的和看起来专业的启动画面的应用程序可吸引用户的注重并且让用户知道应用程序正在启动中。此外,启动画面还可提供行情信息。有时候还是由于法律上的原因:展现版权信息,第三方的标志以及其他信息。

使用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 SplashTest

假如程序是以JAR形式打包的,可在清单文件里用SplashScreen-Image选项来显示启动画面。把图象也打包在JAR里并且在选项里指明图象路径。比如,在mainfest.mf文件里使用如下代码:

Manifest-Version: 1.0

Main-Class: SplashTest

SplashScreen-Image: filename.gif

命令行的形式要优先于清单文件里的设置。

这个特性很轻易使用。多数情况下,你所要做的就是给出图象和启动选项。启动画面在第一个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()方法.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有