虽然Java的启动速度有很大改观,但大型桌面应用的启动通常需要相当长的时间。NetBeans和Eclipse的启动都有一个所谓splashscreen来让用户耐心等待。做splashscreen方法很多,在Java6之前的做法是在undecoratedJframe(JFrame.setUndecorated(true))上帖一个图片。程序开始时显示,在主界面或者登录界面显示前关闭。但即使是这样,由于Java运行时环境庞大,Java虚拟机通常需要相当的时间来初始化,使得用户在双击桌面应用图标到显示splashscreen之间仍有相当可觉察的时间空隙。   Java6在AWT组件中添加了一项功能解决了这个问题,就是在虚拟机启动参数中添加splashscreen的选项,让虚拟机在初始化之前就显示一个splashscreen,大大缩短了桌面应用启动的响应时间,改善了用户体验。这个选项的使用非常简单: java-splash:<splash图片文件的路径> ...xxx.xxx.MainClass
对于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相关推荐

  1. [JavaME]利用java.util.TimerTask来做Splash Screen的N种方法

    请参考java.util.TimerTask. TimerTask is something like Timer in VisualBasic. You can sepcify a time per ...

  2. java splash screen_Java splash screen

    虽然Java的启动速度有很大改观,但大型桌面应用的启动通常需要相当长的时间.NetBeans和Eclipse的启动都有一个所谓splashscreen来让用户耐心等待.做splashscreen方法很 ...

  3. 如何创建启动界面Splash Screen

    启动界面Splash Screen在应用程序是很常用的,往往在启动界面中显示产品Logo.公司Logo或者开发者信息,如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段 ...

  4. 实现在Android开发中的Splash Screen开场屏的效果

    很多网友可能发现近期Tencent推出的手机QQ Android版包含了一个开场屏Splash Screen载入效果,通常游戏或大型软件打开时可能需要一个释放解析资源的过程,需要一个前台的动画播放和后 ...

  5. MFC中添加Splash Screen

    1.  新建一个MFC项目SDI或MDI. 2.  新建或导入一个ID为IDB_SPLASH的位图. 3.  添加现有项SplashWnd.h和SplashWnd.cpp. SplashWnd.h源代 ...

  6. android oreo 开机动画,Android O添加了一个 Splash Screen API帮助简化启动屏制作

    大多数开发者对闪屏(splash screen)都持不同的态度.一些人支持用闪屏隐藏app的加载,然后自然过渡到主界面,而另一些人认为闪屏不管是对用户还是开发者都是浪费时间.谷歌在这个问题上的立场也是 ...

  7. WPF Splash Screen 和启动速度相关资料

    SplashScreen的介绍,陈老师已经写的很详细了,呵呵. WPF:如何为程序添加splashScreen? http://www.cnblogs.com/chenxizhang/archive/ ...

  8. Android App 中正确地使用 Splash Screen(译)

    经过一段时间的调研,我找到了许多Android中的splash (launch) screen实现方法,但是开发者通常是使用一个延时执行的Runnable来解决问题.这种方式我认为并不友好,不应该让用 ...

  9. 用 ABAP 实现的报表欢迎屏幕 - Splash Screen

    说明 I created 2 MODAL screens 0806 & 2009 0806 was for start of job spash & 20009 was an exit ...

最新文章

  1. Spring2.5注释驱动与基于注释的MVC
  2. java读取本地文件_java 读取本地文件实例详解
  3. Postman:Postman简介、安装、入门使用方法详细攻略
  4. 企业微信来了,老板的消息再也无法装作看不见了?​
  5. ACM北大暑期课培训第六天
  6. 04-程序计数器(PC计数器)
  7. 统计车牌识别里面各个lable 的数量
  8. 单片机的串口实验 串口介绍 串口原理
  9. vue+barcode实现扫一扫功能
  10. C语言程序——输入三角形的边长求面积
  11. html适配手机 响应式,移动端适配(响应式)
  12. 灰度直方图与特征直方图的使用方法
  13. MockMockito使用手册
  14. pip及openpyxl安装
  15. 解析m3u8视频播放且兼容pc端
  16. [项目管理-12]:项目经理的困惑:项目管理的常见难题及解决对策
  17. nexus 5x手机进入开发者模式+开启USB调试功能
  18. Graphics.h画线函数和初始化绘制环境
  19. 最全流媒体协议详细总结介绍(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL) /SDP)
  20. SK9815 (48bit )集成幻彩灯

热门文章

  1. WiFi辐射比手机电脑辐射数值小 60厘米外基本为0
  2. python in finance大作业及作答
  3. 2.5元组tuple
  4. Android双波浪自定义控件(DoubleWaveView)
  5. php齐博cms,齐博CMS splitword.php后门解密
  6. 用MyBatis来操作crud
  7. GPS 卫星的信号结构
  8. 在eclipse中安装Jess
  9. Linux ALSA音频系统:soundcard
  10. JVM之类的加载过程(三):初始化——>Initialization