文档章节

java很神奇 用swing制作欢迎屏幕

tojsp_com
 tojsp_com
发布于 2010/08/18 12:50
字数 1151
阅读 1392
收藏 9

 几乎所有时髦的应用都有一个欢迎屏幕。欢迎屏幕既是宣传产品的方法之一,而且在长时间的应用启动过程中,欢迎屏幕还用来表示应用正在准备过程中。现在教你怎么用java中的swing技术制作一个时髦的欢迎屏幕.

下面是一个最简单的欢迎屏幕实现:

Java代码
  1. class SplashWindow1 extends JWindow   
  2. {   
  3. public SplashWindow1(String filename, Frame f)   
  4. {   
  5. super(f);   
  6. JLabel l = new JLabel(new ImageIcon(filename));   
  7. getContentPane().add(l, BorderLayout.CENTER);   
  8. pack();   
  9. Dimension screenSize =   
  10. Toolkit.getDefaultToolkit().getScreenSize();   
  11. Dimension labelSize = l.getPreferredSize();   
  12. setLocation(screenSize.width/2 - (labelSize.width/2),   
  13. screenSize.height/2 - (labelSize.height/2));   
  14. setVisible(true);   
  15. screenSize = null;   
  16. labelSize = null;   
  17. }   
  18. }  

        SplashWindow1类从Swing的JWindow派生。JWindow是一个容器,它没有其他窗口所具有的各种窗口元素,如标题条、窗口管理按钮,甚至连突出显示的边框也没有。因此,JWindow对于制作欢迎屏幕来说是非常合适的。上面的代码假定图形文件在当前目录。图形通过ImageIcon装入内存,然后它就被放到了JWindow的中心。接着,窗口被pack(),这使得Swing把窗口调整到适当的大小,最后窗口被移到了屏幕的中心。

        如果我们运行上面的程序,可以发现虽然欢迎画面确实出现在屏幕中央,但遗憾的,它却不会关闭!要关闭欢迎画面,我们需要加入更多的代码:

Java代码
  1. class SplashWindow2 extends JWindow   
  2. {   
  3. public SplashWindow2(String filename, Frame f)   
  4. {   
  5. super(f);   
  6. JLabel l = new JLabel(new ImageIcon(filename));   
  7. getContentPane().add(l, BorderLayout.CENTER);   
  8. pack();   
  9. Dimension screenSize =   
  10. Toolkit.getDefaultToolkit().getScreenSize();   
  11. Dimension labelSize = l.getPreferredSize();   
  12. setLocation(screenSize.width/2 - (labelSize.width/2),   
  13. screenSize.height/2 - (labelSize.height/2));   
  14. addMouseListener(new MouseAdapter()   
  15. {   
  16. public void mousePressed(MouseEvent e)   
  17. {   
  18. setVisible(false);   
  19. dispose();   
  20. }   
  21. });   
  22. setVisible(true);   
  23. }   
  24. }  

        和原先的SplashWindow1类相比,这个SplashWindow2类唯一的区别在于多出了一个安装到JWindow上的匿名MouseListener。经过这个改动之后,用户可以点击欢迎屏幕关闭它。

        现在我们有了一个很不错的欢迎屏幕,它可以通过点击的方法关闭,但它不会自己消失。接下来我们要加入代码,使得欢迎屏幕在显示一定的时间之后自动消失。这里我们要考虑到运用线程。

Java代码
  1. class SplashWindow3 extends JWindow   
  2. {   
  3. public SplashWindow3(String filename, Frame f, int waitTime)   
  4. {   
  5. super(f);   
  6. JLabel l = new JLabel(new ImageIcon(filename));   
  7. getContentPane().add(l, BorderLayout.CENTER);   
  8. pack();   
  9. Dimension screenSize =   
  10. Toolkit.getDefaultToolkit().getScreenSize();   
  11. Dimension labelSize = l.getPreferredSize();   
  12. setLocation(screenSize.width/2 - (labelSize.width/2),   
  13. screenSize.height/2 - (labelSize.height/2));   
  14. addMouseListener(new MouseAdapter()   
  15. {   
  16. public void mousePressed(MouseEvent e)   
  17. {   
  18. setVisible(false);   
  19. dispose();   
  20. }   
  21. });   
  22. final int pause = waitTime;   
  23. final Runnable closerRunner = new Runnable()   
  24. {   
  25. public void run()   
  26. {   
  27. setVisible(false);   
  28. dispose();   
  29. }   
  30. };   
  31. Runnable waitRunner = new Runnable()   
  32. {   
  33. public void run()   
  34. {   
  35. try  
  36. {   
  37. Thread.sleep(pause);   
  38. SwingUtilities.invokeAndWait(closerRunner);   
  39. }   
  40. catch(Exception e)   
  41. {   
  42. e.printStackTrace();   
  43. // 能够捕获InvocationTargetException   
  44. // 能够捕获InterruptedException   
  45. }   
  46. }   
  47. };   
  48. setVisible(true);   
  49. Thread splashThread = new Thread(waitRunner, "SplashThread");   
  50. splashThread.start();   
  51. }   
  52. }   

        这里的基本思路是利用一个在一定时间内暂停等待的Thread对象。在上面的代码中,线程的暂停时间是4秒。当这个线程唤醒时,它将关闭欢迎屏幕。由于Swing是非线程安全的,除非代码在事件分派线程上执行,否则它就不应该影响任何UI组件的状态。所谓事件分派线程,就是Swing中负责绘图和事件处理的线程。

        为了解决这个问题,Swing设计者赋予我们安全地把Runnable对象加入UI事件队列的能力。在本例中,我们用可运行对象closerRunner完成最关键的工作。我们把可运行对象传入SwingUtilities.invokeAndWait()静态方法,然后wingUtilities.invokeAndWait()进行所有未完成的UI操作,并执行传递给该方法的可运行对象closerRunner的run方法。通过运用一个独立的线程负责欢迎屏幕的关闭操作,应用担负起了显示和关闭欢迎屏幕之间的所有操作。

        如果要让欢迎屏幕总是显示且用户不能关闭它,你必须删除那些隐藏欢迎屏幕的代码。如果要让欢迎屏幕只能由用户手工关闭,你可以象使用任何其他JWindow对象一样调用SplashWindow3对象上的setVisible(false)和dispose()方法。

        总而言之,借助于SwingUtilities.invokeAndWait()方法,我们可以安全地创建出多线程欢迎屏幕。具体实现时,欢迎屏幕可以由用户点击关闭,也可以在一定的时间之后自动关闭。Swing所支持的线程模型使得应用在显示欢迎屏幕之后仍能够响应其他事件和处理其他任务。

 

本文为 leo原创JSP博客独家发布,转载请保留原文地址 http://www.dukai168.cn/blog/77.html,否则将追究法律责任,谢谢配合

© 著作权归作者所有

tojsp_com
粉丝 8
博文 14
码字总数 10888
作品 0
深圳
私信 提问
Google重新推出Instantiations的开发工具

8月初,Google收购了Instantiations,现在,Google重新发布了Instantiations的开发工具,并且对所有开发人员免费: GWT Designer 强大的基于 Eclipse的开发工具,使Java开发者能够使用Google ...

raise
2010/09/17
1K
2
swing Splash Screen

关于登陆之前的那个欢迎屏幕,很多人都是用一个JWindow来使用,其实java本身具备了这样的机制,关于使用JWindow可以看看我那个Frame透明和形状也可以达到一个好的效果。不过JVM提供的比较好,...

Monkey
2011/12/08
343
0
OpenJDK 作为Linux平台默认Java

Martijn Verburg,是Java/JEE 和开源顾问,热衷于软件艺术和技术社区的创造力。其目前是 LJC (伦敦 JUG)联合领导者,运营两个开源项目 (PCGen 和 Ikasan EIP) 。 本文是作者公开的一封信,针...

小卒过河
2011/09/12
5K
12
CHMWriter v2.0 发布

V2.0更新内容如下: 1. 使用Swing图形界面,不再是运行于命令行下; 2. 修改了生成索引的算法,不仅能输入类名,还能够输入方法名进行检索,并且在检索时,对于多个同名的类或方法,程序提供了一个页...

smilethat
2012/04/20
1K
3
好程序员Java教程解读什么是swing

  好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用。运行swing程序要求用户电脑上有java环境,这一点不太现实也不方便。现在的java主要以web方向为主,...

好程序员IT
07/24
30
0

没有更多内容

加载失败,请刷新页面

加载更多

移动端的弹窗滚动禁止body滚动

本文转载于:专业的前端网站➼移动端的弹窗滚动禁止body滚动 前言 最近一个需求是弹窗展示列表,显然是需要一个滚动条的,而滚动到底部就会穿透到body滚动,而阻止默认行为是不行的,这样两个...

前端老手
13分钟前
2
0
设计模式 建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇 UML 与抽象工厂模式比较 本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调...

木本本
18分钟前
2
0
CPU 读取cache、内存、磁盘性能

google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处被引用的很多。 1秒=10^3毫秒=10^6微妙=10^9纳秒=10^12皮秒 读 cache ns 级,读内存100 ns,从内存顺序读1MB 0.25ms,...

SibylY
25分钟前
2
0
在windows virtualbox上安装LEDE

按照 官方指南 安装时遇到若干问题,做一下总结。 一、官方指南链接中的镜像文件安装后报错 snapshots/targets/x86/64 中的 lede-x86-64-combined-squashfs.img 文件安装后,进行网络配置报错...

元谷
34分钟前
2
0
《老子》_安身尘世间,做个明白人

1、无为而无不为 出自《道德经·第四十八章》。【译文】处于无为的境界之中,没有什么不能做到的。 2、知者不言,言者不知。 出自《道德经·第五十六章》。【译文】言语无法表达“道”的真意...

庭前云落
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部