首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JAVA SE6.0 中运用SplashScreen

2012-11-06 
JAVA SE6.0 中使用SplashScreen??????? 在运行一个大型的应用程序,在程序能正式工作前需要一段时间来进行

JAVA SE6.0 中使用SplashScreen

??????? 在运行一个大型的应用程序,在程序能正式工作前需要一段时间来进行初始化.通常我们会显示一个等待画面直到程序初始化完成.在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
??????????????????????? Author: Eastsun
??????????????????????? Created-By: 1.6.0-beta2 (Sun Microsystems Inc.)
??????????????????????? SplashScreen-Image: splash.png
??????????????????????? Main-Class: TestSplash

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

?

?

java 代码
  1. package?SplashTest; ??
  2. ??
  3. import?javax.swing.*; ??
  4. import?java.awt.*; ??
  5. import?java.awt.image.*; ??
  6. ??
  7. public?class?Main{ ??
  8. ????public?static?void?main(String[]?args){ ??
  9. ????????new?Thread(){??????????????????????????????????????????????????//用于运行SplashScreen的线程 ??
  10. ????????????public?void?run(){ ??
  11. ????????????????try{ ??
  12. ????????????????????SplashScreen?splash?=SplashScreen.getSplashScreen(); ??
  13. ????????????????????Graphics2D?g?=splash.createGraphics(); ??
  14. ????????????????????g.setColor(Color.red); ??
  15. ????????????????????g.drawString(splash.getBounds().toString(),10,30);??//SplashScreen在屏幕的位置,大小 ??
  16. ????????????????????g.drawString(splash.getSize().toString(),10,50);????//SplashScreen的大小 ??
  17. ????????????????????g.drawString(splash.getImageURL().toString(),10,70);//当前显示的图片 ??
  18. ????????????????????splash.update();????????????????????????????????????//刷新以上内容到屏幕 ??
  19. ????????????????????Thread.sleep(1000); ??
  20. ???????????????????? ??
  21. ????????????????????//下面的代码是在SplashScreen上显示一个3D效果的字符串 ??
  22. ????????????????????g.setComposite(AlphaComposite.Clear);????????????????????????????????????????????????//1????? ??
  23. ????????????????????g.fillRect(0,0,(int)splash.getSize().getWidth(),(int)splash.getSize().getHeight());??//2 ??
  24. ????????????????????splash.setImageURL(Main.class.getResource("/SplashTest/beauty.jpg"));??????//更改显示的图片 ??
  25. ???????????????????? ??
  26. ????????????????????int?x?=30,?y=100; ??
  27. ????????????????????String?author?="Made?By?Eastsun"; ??
  28. ????????????????????g.setFont(new?Font("TimesRoman",?Font.PLAIN,?30)); ??
  29. ????????????????????g.setPaintMode();????????????????????????????????????????????????????????????????????//3 ??
  30. ????????????????????for(int?i=0;i<5;i++){ ??
  31. ????????????????????????g.setColor(new?Color(200,?200,?0)); ??
  32. ????????????????????????g.drawString(author,?x+i,?y+i-1); ??
  33. ????????????????????????g.setColor(new?Color(100,?100,?0)); ??
  34. ????????????????????????g.drawString(author,?x+i-1,?y+i); ??
  35. ????????????????????} ??
  36. ????????????????????g.setColor(Color.yellow); ??
  37. ????????????????????g.drawString(author,?x+5,?y+5); ??
  38. ????????????????????splash.update(); ??
  39. ????????????????????Thread.sleep(10000);????????????????????????????????//注意,这儿是sleep(10000),但实际上SplashScreen并没有显示10秒???? ??
  40. ????????????????}catch(Exception?e){ ??
  41. ????????????????????e.printStackTrace(); ??
  42. ????????????????} ??
  43. ????????????} ??
  44. ????????}.start(); ??
  45. ???????? ??
  46. ????????try{ ??
  47. ????????????Thread.sleep(3000);?????????????????????????????????????????//这儿决定SplashScreen显示时间长短.????????????????????????????????????????????????????????????? ??
  48. ????????}catch(Exception?e){}???????????????????????????????????????????//对于实际应用程序,这儿对应程序的初始化工作 ??
  49. ????????JFrame?frame?=new?JFrame("Java?SE6?Splash?Test"); ??
  50. ????????frame.setPreferredSize(new?Dimension(320,240)); ??
  51. ????????frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ??
  52. ????????frame.pack(); ??
  53. ????????frame.setVisible(true); ??
  54. ????} ??
  55. } ??
  56. ??

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

热点排行