Java splash screen
对于jar文件 也可以如此运行
java -splase:imagepath -jar **.jar
如果应用程序被打包在 jar 文件中,可以使用清单文件中的 "SplashScreen-Image" 选项来显示闪现屏幕。将图像放在 jar 归档文件中并用选项指定路径。路径不应以斜杠开头。
例如,在 de>manifest.mfde> 文件中:
Manifest-Version: 1.0 Main-Class:Test SplashScreen-Image:filename.gif
命令行接口的优先级高于清单设置。
可以将splash图片放在java桌面应用程序安装目录下,使用相对路径指定其位置。由于是在虚拟机启动之前就显示这个图片,这使得Java桌面应用的启动给用户的感觉同其他桌面应用一样,几乎是瞬时的。另外不需要关心何时关闭splashscreen图片,虚拟机通过侦听WindowEvent.OPEN事件,在第一个JavaGUI(Swing/AWT)窗口出现时自动关闭它。 这个选项可以在开发完成之后加上,开发时不需要考虑任何与其相关的设计,使用非常方便,带来的效果也非常可观。另外现在将java应用打包成exe的工具也都支持这个选项,可以放心使用。Java6的splash是可以和Java应用程序交互的。 java.awt.SplashScreen是java6实现这个功能的API。今天在Evan Summers'blog上看到一篇文章《Splash Screen》,讲述了如何使用这个接口和splashscreen进行交互。 那么如何使用这个接口进行交互呢?Evan Summers举了一个例子:publicclass SplashTest {
staticLogger logger =Logger.getLogger(SplashTest.class.getSimpleName()); //在这儿你能获得通过-splash:设置给程序的splash screen的实例
finalSplashScreen splash = SplashScreen.getSplashScreen();
RectanglesplashBounds;
Graphics2DsplashGraphics;
/** *初始化splash */
protectedvoid initSplash() throws Exception {
if (splash == null) {
throw new Exception("no splash image specified eg.-splash:mysplash.png");
} //下面给splash screen画一个边框
splashBounds = splash.getBounds(); //在这儿初始化图形对象,该图形对象取自splash
splashGraphics = (Graphics2D) splash.createGraphics();
if (splashGraphics == null) throw new Exception("no SplashScreenGraphics2D");
splashGraphics.setColor(Color.YELLOW);
splashGraphics.drawRect(0, 0, splashBounds.width - 1,splashBounds.height - 1);
} /** *更新splash,这个方法 */
protectedvoid updateSplash(String status, int progress) {
if (splash == null) return;
if (splashGraphics == null) return; //重画splash上面的进度并通知splash更新界面
drawSplash(splashGraphics, status, progress);
splash.update(); /** * 这个方法画一个进度条,不再详述。 */
protectedvoid drawSplash(Graphics2D splashGraphics, String status, intprogress) {
int barWidth = splashBounds.width*50/100;
splashGraphics.setComposite(AlphaComposite.Clear);
splashGraphics.fillRect(1, 10, splashBounds.width - 2, 20);
splashGraphics.setPaintMode();
splashGraphics.setColor(Color.BLACK);
splashGraphics.drawString(status, 10, 20);
splashGraphics.setColor(Color.BLACK);
splashGraphics.drawRect(10, 25, barWidth + 2, 10);
splashGraphics.setColor(Color.YELLOW);
int width = progress*barWidth/100;
splashGraphics.fillRect(11, 26, width + 1, 9);
splashGraphics.setColor(Color.WHITE);
splashGraphics.fillRect(11 + width + 1, 26, barWidth - width,9); protectedvoid loadApplication() {
try { //初始化splash
initSplash();
} catch (Exception e) {
logger.log(Level.WARNING, e.getMessage());
} //在下面你初始化程序的过程中调用updateSplash来更新splash
final String[] stages = {"stage 1", "stage 2", "stage 3"};
int stage = 0;
for (int i = 0; i <= 100; i += 5) {
String status = "Loading " + stages[stage] + "...";
if (splash != null) updateSplash(status, i);
try {
Thread.sleep(500);
if (i == 30) stage = 1;
else if (i == 60) stage = 2;
} catch(Exception e) {
e.printStackTrace(); } //在这儿你可以主动关闭splash
if (splash != null) splash.close(); //真正开始的你的登录界面或者主窗口
startApplication();
publicstatic void main(String args[]) {
new SplashTest().loadApplication();} 下面是上面这个程序最后使用-splash:运行的结果:
使用还是非常简单的:获取splash实例,然后获取其图形对象,然后在程序启动的过程中画出进度。注意:这个过程是发生在程序的主线程里的,而不是EDT里的。因此这儿splash图像的更新要求程序员自己来保证线程安全性。另外,这儿不能像往常一样加入Swing组件,因为这时整个Swing系统实际上还没有启动,程序正在操作的是一个非常原始的图形系统。但由于你控制了基本图形设备的,理论上这儿是可以创建出任意复杂的交互界面来。当然如果能用简单的办法就实现进度,不提倡在这儿做过分复杂的图形处理的。 另外java.awt.SplashScreen还提供了大量的其他接口方法,比如:public voidsetImageURL(URLimageURL):动态设置新的splash图片。public synchronized URLgetImageURL():获取splash图片的位置。public voidupdate():主动刷新splash界面,相当于repaint。public synchronized voidclose():关闭splash界面。public boolean isVisible():splash是否正在显示。public Graphics2DcreateGraphics():创建图形对象。public DimensiongetSize():获取splash的尺寸。public RectanglegetBounds():获取splash的位置和尺寸。 总之Java6提供的splashscreen不是一个简单的玩具。只要你稍微熟悉它,就能创建出很好的程序启动感官来。 更新:虽然SplashScreen的进度都需要自己画出来,但还是有个办法可以使用Swing组件的。前面的Swing系列的文章介绍了如何使用Renderer原理来进行代码复用。昨天晚上回去,写了一个SplashManager封装了SplashScreen和任意Swing组件,你可以自己使用GUI设计工具,或者自己使用代码写一个界面,然后使用SplashManager封装起来,就可以想普通Swing界面一样使用了。 原理就是将从SplashScreen哪儿获得的Graphics对象传递给该组件,让该组件完成渲染工作。SplashScreen使用的是分层图像的画法,将使用SplashScreen图形对象画的图像和作为Splash的图像分开渲染,因此这个图形组件渲染的结果是被叠加到图像上面的。在使用Swing组件进行渲染时,只要注意将容器类的组件设置为透明的,将doublebuffer特性禁止就行可以了。 下面是我昨晚写的一个例子,上面使用了一个摆放了JProgessBar和JLabel的JPanel界面,将JPanel设置为透明后,渲染在Splashscreen上,就达到了这种效果:
演示代码可以在这儿下载。编译后这样运行:java -splash:c:\myimage\splash.gif ProgressDemo 这儿的c:\myimage\splash.gif你需要指定成你自己的splash图片地址。
注意:
这儿简单说明下原理: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.
Java splash screen相关推荐
- [JavaME]利用java.util.TimerTask来做Splash Screen的N种方法
请参考java.util.TimerTask. TimerTask is something like Timer in VisualBasic. You can sepcify a time per ...
- java splash screen_Java splash screen
虽然Java的启动速度有很大改观,但大型桌面应用的启动通常需要相当长的时间.NetBeans和Eclipse的启动都有一个所谓splashscreen来让用户耐心等待.做splashscreen方法很 ...
- 如何创建启动界面Splash Screen
启动界面Splash Screen在应用程序是很常用的,往往在启动界面中显示产品Logo.公司Logo或者开发者信息,如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段 ...
- 实现在Android开发中的Splash Screen开场屏的效果
很多网友可能发现近期Tencent推出的手机QQ Android版包含了一个开场屏Splash Screen载入效果,通常游戏或大型软件打开时可能需要一个释放解析资源的过程,需要一个前台的动画播放和后 ...
- MFC中添加Splash Screen
1. 新建一个MFC项目SDI或MDI. 2. 新建或导入一个ID为IDB_SPLASH的位图. 3. 添加现有项SplashWnd.h和SplashWnd.cpp. SplashWnd.h源代 ...
- android oreo 开机动画,Android O添加了一个 Splash Screen API帮助简化启动屏制作
大多数开发者对闪屏(splash screen)都持不同的态度.一些人支持用闪屏隐藏app的加载,然后自然过渡到主界面,而另一些人认为闪屏不管是对用户还是开发者都是浪费时间.谷歌在这个问题上的立场也是 ...
- WPF Splash Screen 和启动速度相关资料
SplashScreen的介绍,陈老师已经写的很详细了,呵呵. WPF:如何为程序添加splashScreen? http://www.cnblogs.com/chenxizhang/archive/ ...
- Android App 中正确地使用 Splash Screen(译)
经过一段时间的调研,我找到了许多Android中的splash (launch) screen实现方法,但是开发者通常是使用一个延时执行的Runnable来解决问题.这种方式我认为并不友好,不应该让用 ...
- 用 ABAP 实现的报表欢迎屏幕 - Splash Screen
说明 I created 2 MODAL screens 0806 & 2009 0806 was for start of job spash & 20009 was an exit ...
最新文章
- Spring2.5注释驱动与基于注释的MVC
- java读取本地文件_java 读取本地文件实例详解
- Postman:Postman简介、安装、入门使用方法详细攻略
- 企业微信来了,老板的消息再也无法装作看不见了?​
- ACM北大暑期课培训第六天
- 04-程序计数器(PC计数器)
- 统计车牌识别里面各个lable 的数量
- 单片机的串口实验 串口介绍 串口原理
- vue+barcode实现扫一扫功能
- C语言程序——输入三角形的边长求面积
- html适配手机 响应式,移动端适配(响应式)
- 灰度直方图与特征直方图的使用方法
- MockMockito使用手册
- pip及openpyxl安装
- 解析m3u8视频播放且兼容pc端
- [项目管理-12]:项目经理的困惑:项目管理的常见难题及解决对策
- nexus 5x手机进入开发者模式+开启USB调试功能
- Graphics.h画线函数和初始化绘制环境
- 最全流媒体协议详细总结介绍(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL) /SDP)
- SK9815 (48bit )集成幻彩灯