原文作者:jackconradson
文章出处:http://java.sun.com/developer/technicalarticles/j2se/desktop/jdic_assoc
译者:hardneedl
联系译者:hardneedl@126.com
jdesktopintegrationcomponents(jdic)站点https://jdic.dev.java.net
文章索引
========
sun微系统公司赞助了jdesktopintegrationcomponents(jdic)项目。这个项目可使用java
技术来访问某些操作系统特有功能,包括:
.设置文件类型的关联
.把某一web浏览器装载到抽象图形工具(abstractwindowtoolkit)的画布上
.把javawebstart程序打包成本机安装程序
.支持系统托盘以及托盘上的弹出式菜单
.开启桌面应用程序,更进一步来进行编辑和打印文件。
本文将来讲述上面列出的五种功能之中的第一:文件类型关联。
什么叫做关联?
=============
每种操作系统,无论是微软的windows,linux,solaris操作系统环境还是苹果公司的macintosh
osx都有几种类型的桌面图形用户界面来表示计算机上可连同程序一起运行的文件。当用户在一个
数据文件上点击时候,操作系统是如何知道需要以哪个应用程序来打开这个数据文件的呢?当用户
决定在windows操作系统上更改一个文件的文件名,然而却忽略了附上文件的扩展名,那么windows
为什么会突然地忘记了该使用哪个程序来使用这个文件呢?
很容易回答上面的问题:每种操作系统都维护着一个与文件扩展名相关信息的数据表。每个扩展名
关联到一种文件类型,在这样的一个数据表里,每种文件类型类型都有至少一种以上的动作与之相关。
这些动作通常是诸如打开,编辑或者打印文件。此外,每种动作都会找到根据与之关联的可执行程序来
完成这些功能。在一种文件上发起一个动作时候,操作系统就到那个保存了跟扩展名有关联的信息表里
去找出与这种文件对应的默认的应用程序来执行。当操作系统不能在这个信息表里找到默认的程序的时候,
将会询问用户选取某个应用程序来执行他们所希望的动作。
在windowsxp上,点选任一文件系统窗口上的菜单项“工具->文件夹选项”菜单就可看到上文提到的信息
表。下图就显示了这个信息表上关于.txt文件对应的编辑程序。选中扩展名txt后,点击对话框底部的
“高级”按钮。请注意列在新弹出的对话框里的三个动作:“打开”,“打印”,“打印到”。在动作列表
中点选名为“打开”的那个选项后在点击“编辑”按钮就会出现另一个对话框。这个“打开”动作使用了
notepad.exe程序来为所有扩展名是.txt的文件执行“打开”的动作的。假如用户无意中把.txt的扩展名改
成了.txr,那么操作系统就不知道启用哪个程序来为这个扩展名是.txr的文件执行打开动作了,就是因为在
信息表里没有关于扩展名为.txr的记录。

jdic中的关联类
==============
正如那句响亮的话语:“一次编写,到处运行”那样,java平台隐藏了与操作系统特性的相关。这也就使得
java应用程序能够访问文件类型信息表。jdic致力于解决这样的问题。安装上jdic的库文件,j在ava平台上
开发的程序员就通过使用一些类来做与文件关联相关的任务了。你应该熟悉三个主要的类:associationservice,
association,action,这三个主要的类位于org.jdesktop.jdic.filetypes包。请注意:本文仅以
org.jdesktop.jdic.filetypes包里的action类来讲述,不牵扯任何wat或者java基本类库(jfc)和swing中的类。
org.jdesktop.jdic.filetypes.association程序员借助association类来创建新的文件类型或者更改现存的文件类型。可使用这个类里的一些方法来编辑文件类型
,mime扩展类型,与文件类型对应的图标以及关联到文件类型的动作。
org.jdesktop.jdic.filetypes.action借助action类来为文件类型指定动作。所谓的动作就入上文中提到的包括“打开”或者“编辑”。为每一个动作指派
一个可执行程序的路径来实现功能。必须在文件类型上把action对象添加到association对象。
org.jdesktop.jdic.filetypes.associationserviceassociationservice类用来让程序员在文件类型信息表中添加或删除条目。既可用管理员身份或者一般用户的身份来实现这样的功能。这个类用association对象在文件类型信息表中作添加或删除的动作。当associationservice类在文件类型信息表上做添加或编辑操作后,那么对应的文件类型就在信息表里驻留下来了。这种驻留不会因为那个创建或者进行编辑文件类型的java应用程序的结束而改变,直到文件类型信息条目由于外部的某些原因或者是由于associationservice对象做的工作导致被删除了才会改变。associationservice对象在文件类型信息表里既能查找特定的文件扩展名,也能查找mime的类型。如果找到了需要的文件类型了,那么就返回一个代表那种文件类型的association对象。associationservice对象可访问文件类型信息表里的条目,因此程序员就能更改一些内容,比如让扩展名doc关联到staroffice程序而不是微软的word。
接下类举例说明怎样使用上面提到的这些类。请注意:示例代码需要用最终发布的0.9.1稳定版本的jdic库。
注册关联
========
第一个例子让扩展名为.log的文件类型上的“打开”动作关联到windows的记事本程序。示例代码在文件类型信息表
中新增关于.log类型的条目。windows操作系统上忽略大小写,我们既可以.log,.log,.log或者.log来表示。一旦
程序被执行,用户就可以双击方式用记事本打开.log文件了。再提醒下,association已经使得文件类型在信息
表里固定下来了,也就是说即使这个java程序终止后,.log文件的类型的关联依旧在文件类型信息表里保存着。
importorg.jdesktop.jdic.desktop.*;
importorg.jdesktop.jdic.filetypes.*;
associationserviceserv=newassociationservice();
associationlogassoc=newassociation();
//addsthe.logtypetotheassociationobject.
logassoc.addfileextension("log");
//addsanactiontotheassociationobjectthatwill
//opena.logfilewithwindowsnotepad.
logassoc.addaction(newaction("open","c://windows//system32//notepad.exe%1"));
try{
//addsthe.logassociationtothefiletypes'table
//attheuserlevelusinganassociationserviceobject.
serv.registeruserassociation(logassoc);
}
catch(java.lang.illegalargumentexceptione){
//thisexceptionwillbecaughtifthegivenassociationisnotvalid
//tobeaddedtothetableoffiletypes.
system.err.println(e);
}
catch(associationalreadyregisteredexceptione){
//thisexceptionwillbecaughtiftheassociationalready
//existsinthetableoffiletypes.
system.err.println(e);
}
catch(registerfailedexceptione){
//thisexceptionwillbecaughtiftheassociationwas
//unabletobeaddedtothetableoffiletypes.
system.err.println(e);
}.log文件类型被添加到信息表后,这个信息表类似下图所展示的效果。图中附带着在windows
操作系统上的.log文件带着的那一个图标。

删除关联
========
不仅可向操作系统中增加文件关联,也能删除它们。接下来的代码演示了从文件类型信息表里删除与.log
有关的条目。借助associationservice对象在文件类型信息表里找到有关.log的条目并永久地删除之。
importorg.jdesktop.jdic.desktop.*;
importorg.jdesktop.jdic.filetypes.*;
associationserviceserv=newassociationservice();
//thisusesanassociationservicetosearchthetableoffile
//typesforthe.logextension.ifthe.logfileisfound,
//anassociationobjectrepresentingthe.logfiletype
//willbereturned.otherwise,nullisreturned.
associationlogassoc=serv.getfileextensionassociation("log");
try{
//theassociationservicewillremovethe.logfiletypefrom
//thetableoffiletypes.
serv.unregisteruserassociation(logassoc);
}catch(java.lang.illegalargumentexceptione){
//thisexceptionwillbecaughtifthegivenassociationisnotvalid
//toberemovedfromthetableoffiletypes.
system.err.println(e);
}catch(associationnotregisteredexceptione){
//thisexceptionwillbecaughtiftheassociationdoesnotalready
//existinthetableoffiletypes.
system.err.println(e);
}catch(registerfailedexceptione){
//thisexceptionwillbecaughtiftheassociationwasunabletobe
//removedfromthetableoffiletypes.
system.err.println(e);
}从文件类型信息表中删除关于.log的条目后,这个信息表类似如下图所示,同时也附带
上此时的对应于.log文件的图标
尽管以上的例子展示了jdic在文件类型上所提供的功能,但还是至少有一个主要的局限性。
当文件类型被关联到多个动作,如“打开”或“编辑”,这些动作需要用对应的可执行程序
来执行“打开”或者“编辑”。可执行程序路径完全是与操作系统相关的,所以说使用动作
的时候并不能做到与平台无关。但是jdic中多数的特性是平台无关的,并不像那些与文件类型
有关的类那样的平台相关。
以上代码点出了可运行的示例代码中的要点处。你可下载本文后面提到的netbeanside5.0
和展示如何使用jdic桌面程序关联的示例源代码来建立完成的应用程序。这个程序用仅带一个
菜单条的jframe来让用户添加和删除一个.jlog类型。当文件类型信息表里有.jlog条目时,用户
可打开.jlog文件。为了在此应用程序里打开.jlog文件,还需要jdic中其他几个类(
rg.jdesktop.jdic.desktop.desktop)的一些帮助。这个desktop类可让java应用程序用本机程序
来打开,编辑或者打印文件。
下图显示了运行在windowsxp操作系统上的效果,可看到有个错误日志的菜单。这个示例程序假设
.jlog类型未在文件类型信息表中。

结论
=====
借助jdic的实用特性,java程序员就好象拥有了一样工具,借助这个工具来访问以前所不能访问的
操作系统特性。本文讨论了jdic是如何在多个操作系统上的文件类型关联方面工作的,也给你准备
了一个完成的示例程序来让用户重置操作系统上的文件关联。通过这个应用程序,清楚地说明:
在java平台上已经开始用jdic来为本机程序和java程序之间架设了桥梁。
源代码
======
以netbeanside5.0的工程形式下载完整的应用程序源代码(http://java.sun.com/developer/technicalarticles/j2se/desktop/jdic_assoc/jdicassociations.zip)
假如你仅对源代码有兴趣的话,请查看压缩包中src文件夹内的文件。请注意:需要下载最新的
jdic库文件(https://jdic.dev.java.net),并且把这些库包含到netbeans所建立的工程的
运行库中,或者脱离于netbeans的情况下编译与运行时的classpath中。
闽公网安备 35060202000074号