下载本文源代码
提要:本文将以具体的实例向你展示java se 6在桌面开发中所提供的一系列优秀特征。
一、 引言
随着java se 6 beta的发行,java开发者再也不需要自己去实现java本机接口(jni)便可以在其应用程序中加入桌面产品所具有的特征。这些桌面集成特征现在已成为内核的一个组成部分。
最新的java标准版本6.0(代码名为mustang)将在功能上进行一系列的改进--开发者们能够方便地用java处理安全,jmx,操作系统文件,国际化和桌面开发等一系列问题。sun在开发这个版本的过程中表现出非常积极的合作态度。他们通过jsr 270仔细地倾听开发者的意见并且在2006年2月早些时候就发行了所有的java se源码和二进制代码。看来,sun正在倾力打造全新的桌面开发工具。
相对于以前的java版本,mustang的桌面集成能力特别受java开发者欢迎。这些新特征把很多有趣的功能加入到java桌面应用程序的开发中。以前,开发例如internet explorer,系统托盘和邮件客户端等java时,开发者必须在创建如jtray和systray等java本机接口(jni)方面大伤脑筋。尽管这种"补丁"方案能够实现既定目的,但是绝大部分的java开发者都非常盼望这些特征成为核心java平台的一部分。
本文将详细分析一个示例应用程序gomustang的创建过程。从中,我将向你展示如何使用java se 6在应用程序启动时显示一个splash屏幕,怎样创建系统托盘,以及怎样从java内部启动本机桌面互联网浏览器。
注意,为调试本文中的示例程序,你需要安装:java standard edition 6 beta和apache ant 1.6.5。
二、 开发环境
(一) 准备java se 6 beta
首先,你要从sun的java站点下载java se 6 beta。因为sun已经确定将在2006年的秋天正式发行java se 6,而且据jsr 270专家组的建议其中的一些特征还将会作适当的改变;因此,目前在你的桌面开发中试用mustang正是时候。
估计,最终本文中所描述的特征不会出现多大变化;所以你可以放心使用jdk,jre等的最新下载版本。
首先,请确保你的桌面平台被支持。我在windows xp上开发和测试了本文的示例应用程序,且毫无问题。
其次,还要确保你的计算机的windows系统属性中的环境变量指向java se 6.0 jdk。我把java_home环境变量设置为java_home=c:/program files/java/jdk1.6.0。
一旦安装完成,你应该立即检查java jre的版本。如果一切顺利,应该显示类似下面的一条消息:
(二) 准备ant
在本文中,你将使用apache ant来构建示例应用程序。因此,如果你还没有这个工具,你可以从apache网站下载并把它安装到你的计算机上。
然后,你可以使用ant属性来检查ant java版本。下列的例子显示了一个不正确的java版本:
这是因为ant内置的ant.java.version系统属性被设计仅拥有1.1,1.2,1.3,1.4和1.5这几个值。估计,ant开发小组可能很快就会更新这个属性以包含1.6;但是,当你想自己实现这一点时要特别小心。
为了慎重起见,你可以使用-debug参数来运行ant。如果显示如下内容,则说明ant实际上在使用一个1.6版本的jre:
(三) 安装你的开发环境
接下来,安装你的开发环境。为此,最简单的方法是下载本文相应的源码并解压。如果你把zip文件解压到你的c:/路径下,那么你会看到如下结构的文件和目录:
后面,你将使用ant构建文件build.xml来实现复制,编译,构建,打包和运行gomustang示例应用程序。该文件包含下列几个关键的ant目标:
这里,[init]目标负责建立文件夹结构并且把文件拷贝到build文件夹;[compile]实现编译,而[dist]通过使用一个manifest文件来创建一个jar(后面将详细讨论)。[run]目标负责启动你的应用程序,而[clean]将帮助你首先删除所有的由ant任务所创建的文件和目录,然后从一个完全干净的环境开始下面的任务。
src目录包含3个文件:一个gomustang.java(源码文件)和两个gif文件(gomustang-splash.gif用作splash屏幕,gomustang.gif用作系统托盘中的图标)。
现在,你已经打好了基础。下面,我们开始创建你的应用程序的splash屏幕。
三、 splash屏幕
对基于桌面的应用程序来说,splash屏幕一直在应用程序的启动过程中起着关键作用。一个醒目的splash屏幕能使用户热切地盼望应用程序的启动--通过显示行销广告,特定的法律条文,专业图象,等等。同时,它还提供给应用程序一定的时间周期以装载要求的库文件。
在java应用程序开发中,实现splash屏幕一直是一种挑战性编程,因为在jvm启动和所有要求的jre和应用程序库被装载前程序无法取得控制权。而等到一个java应用程序得到控制线程的机会时,显示一个splash屏幕已经太晚了。
java se 6甚至允许一个应用程序在jvm启动前就可以显示一个splash屏幕。这项功能被构建于java应用程序启动器中--由它负责在一个未经修饰的窗口中显示一幅图像。它允许使用gif,png或jpeg图象,可以是透明性或半透明的,并且可以存在动画效果。而且,java se 6发行中还带有一个splashscreen类--它允许一旦应用程序控制线程,该程序就可以操作splash屏幕。
你可以用下面两种方式之一来启动一个splash屏幕:
1. 在一个jar的manifest文件中指定一个具体的splashscreen-image属性;
2. 使用一个命令行-splash参数。
(一) 使用jar的manifest属性
本文下载源码中的jar文件包含了一个gomustang-splash.gif文件(此文件在应用程序启动时显示一个splash屏幕)和编译类文件gomustang.class。这个jar文件的manifest包含定义main()方法的类的名字和splashscreen-image属性(它指向gomustang-splash.gif文件)。
下面的列表展示了ant build.xml jar任务的内容--其中指定了main-class和splashscreen-image属性:
为了看清splash屏幕的真正运行,你可以通过在命令提示符上输入ant run来执行build.xml的[run]目标。因该程序很小,所以java应用程序会在人眼能看见它之前完成打开和关闭操作。为此,你可以使用暂停3秒的编码小技巧。
一旦运行run目标,ant应该会输出如图1所示的控制台跟踪信息,然后暂停3秒,此间用户会看到splash屏幕中的gomustang-splash.gif图片。
3秒后,ant脚本完成应用程序的创建,见图2。
一个图标将在系统托盘中被创建,由图3所示。
(二) 使用命令行-splash参数
显示一个splash屏幕的第二种方法是,使用-splash命令行参数传递splash屏幕文件名,如下所示
c:/mustang/build> java -splash:gomustang-splash.gif gomustang
注意,为了使该命令正常运行,你需要从c:/mustang/build目录(编译class文件和splash屏幕gif文件所在的位置)下使用java的命令行方式。这些文件都是由ant中的build.xml文件中的任务所创建。
一旦应用程序获得一个线程的存取权限,你就可以使用java.awt.splashscreen类通过编程存取splash屏幕。这是一个singleton类,它提供专门的函数来改变splash屏幕图像,检索splash屏幕的大小和界限,操作有关图形对象,并最后关闭splash屏幕。 四、 gomustang.java文件
在继续之前,你应该先熟悉一下gomustang.java文件。这个文件定义一个单个的java类gomustang,并且包含下列两个关键函数:
? main
? createtrayicon()
你可能已经猜出,main是主要的入口点-你可以存取java.awt.splashscreen java类以操作splash屏幕。在gomustang应用程序中,你可以使它暂停几秒,然后通过调用splashscreen.close()来关闭splash屏幕。然而,你可以在关闭它之前来操作该splash屏幕。
createtrayicon()类是这两个函数中更为令人激动的。它负责实现所有的有趣的工作来安装应用程序。这又涉及到我们将要讨论的另一个主题:系统托盘图标。
五、 系统托盘图标
系统托盘位于windows的任务状态区或位于gnome的通知区。它是在一个操作系统的桌面ui的角落的一个很小的区域,能提供到当前运行的应用程序的可视化和直接的存取。本文所提供的windows平台上的gomustang应用程序能够实现当右击系统托盘图标时产生一个弹出菜单(见图4)。
该gomustang应用程序systemtray有一个弹出菜单。菜单有两个菜单项:"exit"和"launch browser"。"exit"负责退出应用程序,而"launch browser"负责打开默认的互联网浏览器并使其指向http://www.devx.com。
在过去,创建能够灵活控制操作系统的桌面系统托盘的java应用程序需要不是java核心部分的库的支持。为此,产生了jdic(java桌面集成组件),而且sun决定把jdic的一些组件作为java se 6的一部分一同发行。相关的类java.awt.systemtray和java.awt.desktop描述了这些关键组件。其中,java.awt.systemtray描述操作系统的任务状态区或通知区。
显示在系统托盘中的图标是由java.awt.trayicon描述的。trayicon不仅描述图像而且还描述接收事件的实际对象,并负责显示提示信息,添加弹出菜单项,显示消息,等等。你可以通过displaymessage(string)和settooltip(string)函数来设置trayicon上的消息和提示信息。trayicon还能把actionevents转发到经由trayicon的addactionlistener(actionlistener)函数注册的actionlistener。弹出菜单是由java.awt.popupmenu描述的,而且你可以通过addpopupmenu(popupmenu)函数把它们添加到trayicon。
下面,让我们剖析一下gomustang java类的createtrayicon()函数。正如在列表1(见所附源码)中的gomustang代码的详细注释所表明的:首先,你要调用systemtray.issupported()函数来检查是否操作系统支持最小systemtray功能;如果支持的话,这个函数应该返回true。
一旦程序知道操作系统支持系统托盘功能,它就创建exit和launch browser菜单项,而且把这些菜单项加到弹出菜单中。当用户右击系统托盘的图标时,这个菜单就会弹出。actionlisteners函数被加到exit和launch browser菜单项上。当用户选择这些菜单项时,actionperformed(actionevent)将给程序一个机会执行某种动作。这对于exit菜单项来说是通过执行system.exit(0)命令而退出应用程序;而对于launch browser菜单项来说是通过指向http://www.devx.com而启动缺省的浏览器。注意,启动浏览器需要使用新的java.awt.desktop对象(稍后再讨论)。
然后,应用程序创建一个弹出菜单对象并且把exit和launch browser菜单项添加到弹出菜单。下一步是用一个奔马图像创建托盘图标。你可以使用getclass().getresourceasstream(file name)函数存取本文下载源码中的gomustang.gif文件并把它加载到一个图像对象中。然后,托盘图标对象就可以与弹出菜单一同创建;action和鼠标听取器也被关联到托盘图标上--对于本文例程来说,只显示一条消息。托盘图标最后被添加到系统托盘上。系统托盘是一个singleton对象,它可以通过systemtray对象的getsystemtray()函数加以检索。在系统托盘上创建托盘图标的完整过程就是这样。
现在,让我们更详细地看一下"launch browser"菜单项是如何启动浏览器的。你可以分析相应于"launch browser"菜单项的函数actionperformed(actionevent)"来查看如何使用桌面对象。请参考下面代码(列表2的一部分):
在列表2(见所附源码)中最让我们感兴趣的关键对象是java.awt.desktop类。这个desktop类,如我们早些时候所提及的,来自jdic。该desktop类负责定位和运行操作系统特定的桌面应用程序。默认的因特网浏览器应用程序映射是mozilla的firefox;因此,在显示消息"launching browser..."以后,desktop.browse(uri)函数将打开一个指向http://dev.yesky.com的窗口。
六、 小结
对于java在桌面控制方面的开发来说,真正有趣的事情刚刚开始。我们真诚期盼在java以后的发行版本中加入更多的桌面控制功能。
提要:本文将以具体的实例向你展示java se 6在桌面开发中所提供的一系列优秀特征。
一、 引言
随着java se 6 beta的发行,java开发者再也不需要自己去实现java本机接口(jni)便可以在其应用程序中加入桌面产品所具有的特征。这些桌面集成特征现在已成为内核的一个组成部分。
最新的java标准版本6.0(代码名为mustang)将在功能上进行一系列的改进--开发者们能够方便地用java处理安全,jmx,操作系统文件,国际化和桌面开发等一系列问题。sun在开发这个版本的过程中表现出非常积极的合作态度。他们通过jsr 270仔细地倾听开发者的意见并且在2006年2月早些时候就发行了所有的java se源码和二进制代码。看来,sun正在倾力打造全新的桌面开发工具。
相对于以前的java版本,mustang的桌面集成能力特别受java开发者欢迎。这些新特征把很多有趣的功能加入到java桌面应用程序的开发中。以前,开发例如internet explorer,系统托盘和邮件客户端等java时,开发者必须在创建如jtray和systray等java本机接口(jni)方面大伤脑筋。尽管这种"补丁"方案能够实现既定目的,但是绝大部分的java开发者都非常盼望这些特征成为核心java平台的一部分。
本文将详细分析一个示例应用程序gomustang的创建过程。从中,我将向你展示如何使用java se 6在应用程序启动时显示一个splash屏幕,怎样创建系统托盘,以及怎样从java内部启动本机桌面互联网浏览器。
注意,为调试本文中的示例程序,你需要安装:java standard edition 6 beta和apache ant 1.6.5。
二、 开发环境
(一) 准备java se 6 beta
首先,你要从sun的java站点下载java se 6 beta。因为sun已经确定将在2006年的秋天正式发行java se 6,而且据jsr 270专家组的建议其中的一些特征还将会作适当的改变;因此,目前在你的桌面开发中试用mustang正是时候。
估计,最终本文中所描述的特征不会出现多大变化;所以你可以放心使用jdk,jre等的最新下载版本。
首先,请确保你的桌面平台被支持。我在windows xp上开发和测试了本文的示例应用程序,且毫无问题。
其次,还要确保你的计算机的windows系统属性中的环境变量指向java se 6.0 jdk。我把java_home环境变量设置为java_home=c:/program files/java/jdk1.6.0。
一旦安装完成,你应该立即检查java jre的版本。如果一切顺利,应该显示类似下面的一条消息:
| c:/java/mustang> java -version java version "1.6.0-beta" java(tm) 2 runtime environment, standard edition (build 1.6.0-beta-b59g) java hotspot(tm) client vm (build 1.6.0-beta-b59g,mixed mode,sharing) |
(二) 准备ant
在本文中,你将使用apache ant来构建示例应用程序。因此,如果你还没有这个工具,你可以从apache网站下载并把它安装到你的计算机上。
然后,你可以使用ant属性来检查ant java版本。下列的例子显示了一个不正确的java版本:
| ${ant.java.version} |
这是因为ant内置的ant.java.version系统属性被设计仅拥有1.1,1.2,1.3,1.4和1.5这几个值。估计,ant开发小组可能很快就会更新这个属性以包含1.6;但是,当你想自己实现这一点时要特别小心。
为了慎重起见,你可以使用-debug参数来运行ant。如果显示如下内容,则说明ant实际上在使用一个1.6版本的jre:
| >> detected java version: 1.5 in: c:/program files/java/jdk1.6.0/jre << |
(三) 安装你的开发环境
接下来,安装你的开发环境。为此,最简单的方法是下载本文相应的源码并解压。如果你把zip文件解压到你的c:/路径下,那么你会看到如下结构的文件和目录:
| c:/mustang/ |_build.xml +_src |
后面,你将使用ant构建文件build.xml来实现复制,编译,构建,打包和运行gomustang示例应用程序。该文件包含下列几个关键的ant目标:
| [init] [clean] [compile] [dist] [run] |
这里,[init]目标负责建立文件夹结构并且把文件拷贝到build文件夹;[compile]实现编译,而[dist]通过使用一个manifest文件来创建一个jar(后面将详细讨论)。[run]目标负责启动你的应用程序,而[clean]将帮助你首先删除所有的由ant任务所创建的文件和目录,然后从一个完全干净的环境开始下面的任务。
src目录包含3个文件:一个gomustang.java(源码文件)和两个gif文件(gomustang-splash.gif用作splash屏幕,gomustang.gif用作系统托盘中的图标)。
现在,你已经打好了基础。下面,我们开始创建你的应用程序的splash屏幕。
三、 splash屏幕
对基于桌面的应用程序来说,splash屏幕一直在应用程序的启动过程中起着关键作用。一个醒目的splash屏幕能使用户热切地盼望应用程序的启动--通过显示行销广告,特定的法律条文,专业图象,等等。同时,它还提供给应用程序一定的时间周期以装载要求的库文件。
在java应用程序开发中,实现splash屏幕一直是一种挑战性编程,因为在jvm启动和所有要求的jre和应用程序库被装载前程序无法取得控制权。而等到一个java应用程序得到控制线程的机会时,显示一个splash屏幕已经太晚了。
java se 6甚至允许一个应用程序在jvm启动前就可以显示一个splash屏幕。这项功能被构建于java应用程序启动器中--由它负责在一个未经修饰的窗口中显示一幅图像。它允许使用gif,png或jpeg图象,可以是透明性或半透明的,并且可以存在动画效果。而且,java se 6发行中还带有一个splashscreen类--它允许一旦应用程序控制线程,该程序就可以操作splash屏幕。
你可以用下面两种方式之一来启动一个splash屏幕:
1. 在一个jar的manifest文件中指定一个具体的splashscreen-image属性;
2. 使用一个命令行-splash参数。
(一) 使用jar的manifest属性
本文下载源码中的jar文件包含了一个gomustang-splash.gif文件(此文件在应用程序启动时显示一个splash屏幕)和编译类文件gomustang.class。这个jar文件的manifest包含定义main()方法的类的名字和splashscreen-image属性(它指向gomustang-splash.gif文件)。
下面的列表展示了ant build.xml jar任务的内容--其中指定了main-class和splashscreen-image属性:
| ... <jar jarfile="${dist}/gomustang.jar" basedir="${build}"> <manifest> <attribute name="main-class" value="gomustang"/> <attribute name="splashscreen-image" value="gomustang-splash.gif"/> </manifest> </jar> ... |
为了看清splash屏幕的真正运行,你可以通过在命令提示符上输入ant run来执行build.xml的[run]目标。因该程序很小,所以java应用程序会在人眼能看见它之前完成打开和关闭操作。为此,你可以使用暂停3秒的编码小技巧。
一旦运行run目标,ant应该会输出如图1所示的控制台跟踪信息,然后暂停3秒,此间用户会看到splash屏幕中的gomustang-splash.gif图片。
![]() 图1.ant暂停 |
3秒后,ant脚本完成应用程序的创建,见图2。
![]() 图2.ant脚本完成系统托盘的创建 |
一个图标将在系统托盘中被创建,由图3所示。
![]() 图3.gomustang图标 |
(二) 使用命令行-splash参数
显示一个splash屏幕的第二种方法是,使用-splash命令行参数传递splash屏幕文件名,如下所示
c:/mustang/build> java -splash:gomustang-splash.gif gomustang
注意,为了使该命令正常运行,你需要从c:/mustang/build目录(编译class文件和splash屏幕gif文件所在的位置)下使用java的命令行方式。这些文件都是由ant中的build.xml文件中的任务所创建。
一旦应用程序获得一个线程的存取权限,你就可以使用java.awt.splashscreen类通过编程存取splash屏幕。这是一个singleton类,它提供专门的函数来改变splash屏幕图像,检索splash屏幕的大小和界限,操作有关图形对象,并最后关闭splash屏幕。 四、 gomustang.java文件
在继续之前,你应该先熟悉一下gomustang.java文件。这个文件定义一个单个的java类gomustang,并且包含下列两个关键函数:
? main
? createtrayicon()
你可能已经猜出,main是主要的入口点-你可以存取java.awt.splashscreen java类以操作splash屏幕。在gomustang应用程序中,你可以使它暂停几秒,然后通过调用splashscreen.close()来关闭splash屏幕。然而,你可以在关闭它之前来操作该splash屏幕。
createtrayicon()类是这两个函数中更为令人激动的。它负责实现所有的有趣的工作来安装应用程序。这又涉及到我们将要讨论的另一个主题:系统托盘图标。
五、 系统托盘图标
系统托盘位于windows的任务状态区或位于gnome的通知区。它是在一个操作系统的桌面ui的角落的一个很小的区域,能提供到当前运行的应用程序的可视化和直接的存取。本文所提供的windows平台上的gomustang应用程序能够实现当右击系统托盘图标时产生一个弹出菜单(见图4)。
![]() 图4.在系统托盘上的gomustang的弹出菜单 |
该gomustang应用程序systemtray有一个弹出菜单。菜单有两个菜单项:"exit"和"launch browser"。"exit"负责退出应用程序,而"launch browser"负责打开默认的互联网浏览器并使其指向http://www.devx.com。
在过去,创建能够灵活控制操作系统的桌面系统托盘的java应用程序需要不是java核心部分的库的支持。为此,产生了jdic(java桌面集成组件),而且sun决定把jdic的一些组件作为java se 6的一部分一同发行。相关的类java.awt.systemtray和java.awt.desktop描述了这些关键组件。其中,java.awt.systemtray描述操作系统的任务状态区或通知区。
显示在系统托盘中的图标是由java.awt.trayicon描述的。trayicon不仅描述图像而且还描述接收事件的实际对象,并负责显示提示信息,添加弹出菜单项,显示消息,等等。你可以通过displaymessage(string)和settooltip(string)函数来设置trayicon上的消息和提示信息。trayicon还能把actionevents转发到经由trayicon的addactionlistener(actionlistener)函数注册的actionlistener。弹出菜单是由java.awt.popupmenu描述的,而且你可以通过addpopupmenu(popupmenu)函数把它们添加到trayicon。
下面,让我们剖析一下gomustang java类的createtrayicon()函数。正如在列表1(见所附源码)中的gomustang代码的详细注释所表明的:首先,你要调用systemtray.issupported()函数来检查是否操作系统支持最小systemtray功能;如果支持的话,这个函数应该返回true。
一旦程序知道操作系统支持系统托盘功能,它就创建exit和launch browser菜单项,而且把这些菜单项加到弹出菜单中。当用户右击系统托盘的图标时,这个菜单就会弹出。actionlisteners函数被加到exit和launch browser菜单项上。当用户选择这些菜单项时,actionperformed(actionevent)将给程序一个机会执行某种动作。这对于exit菜单项来说是通过执行system.exit(0)命令而退出应用程序;而对于launch browser菜单项来说是通过指向http://www.devx.com而启动缺省的浏览器。注意,启动浏览器需要使用新的java.awt.desktop对象(稍后再讨论)。
然后,应用程序创建一个弹出菜单对象并且把exit和launch browser菜单项添加到弹出菜单。下一步是用一个奔马图像创建托盘图标。你可以使用getclass().getresourceasstream(file name)函数存取本文下载源码中的gomustang.gif文件并把它加载到一个图像对象中。然后,托盘图标对象就可以与弹出菜单一同创建;action和鼠标听取器也被关联到托盘图标上--对于本文例程来说,只显示一条消息。托盘图标最后被添加到系统托盘上。系统托盘是一个singleton对象,它可以通过systemtray对象的getsystemtray()函数加以检索。在系统托盘上创建托盘图标的完整过程就是这样。
现在,让我们更详细地看一下"launch browser"菜单项是如何启动浏览器的。你可以分析相应于"launch browser"菜单项的函数actionperformed(actionevent)"来查看如何使用桌面对象。请参考下面代码(列表2的一部分):
| ... menuitem launchbrowseritem = new menuitem("launch browser"); actionlistener launchlistener = new actionlistener() { public void actionperformed(actionevent e) { if (desktop.isdesktopsupported()) { actionmessage = "launched browser"; try{ trayicon.displaymessage("gomustang!", "launching browser...", trayicon.messagetype.info); desktop desktop = desktop.getdesktop(); desktop.browse(new uri("http://dev.yesky.com")); trayicon.settooltip("gomustang!"); } catch(exception exp){...} } } }; launchbrowseritem.addactionlistener(launchlistener); ... |
在列表2(见所附源码)中最让我们感兴趣的关键对象是java.awt.desktop类。这个desktop类,如我们早些时候所提及的,来自jdic。该desktop类负责定位和运行操作系统特定的桌面应用程序。默认的因特网浏览器应用程序映射是mozilla的firefox;因此,在显示消息"launching browser..."以后,desktop.browse(uri)函数将打开一个指向http://dev.yesky.com的窗口。
六、 小结
对于java在桌面控制方面的开发来说,真正有趣的事情刚刚开始。我们真诚期盼在java以后的发行版本中加入更多的桌面控制功能。




闽公网安备 35060202000074号