摘要
相关下载https://jdic.dev.java.net
本文简单介绍了JDIC(JDesktop Integration Components)的用途,以及以实例的形式教你如何使用JDIC调用或者整合本地桌面环境的组件或应用程序。
如果你经常访问java.net,或者读过JavaOne的新闻报道,你可能听过Jdesktop Integration Components(JDIC)。这些新的API终于能让Java开发人员做那些我们曾经羡慕本地同胞们所做的那些事情了。本文将给你一个有关JDIC特性的全面介绍,每一个特性都带有一个小例子,以及要迈出第一步该下载些什么的一个列表。除了SaverBeans子项目我们要在第二部分介绍外,我们将试验所有的API
JDesktop Integration Components,或JDIC,是一个给Java开发人员提供通过交差平台API存取本地特性的包罗万象的项目。该项目由Sun的Desktop组启动,目的是让Java应用能更好地和它们所运行的桌面环境集成。为了能从开发人员那里得到想要的特性的快速反馈,他们将JDIC做成了开源项目。尽管目前没有计划,但JDIC团队正考虑把JDIC的特征加入Java核心类库的未来版本中去
JDIC分为五个部分和一个孵化中的项目:
l 桌面:为了打开、编辑和用email邮寄文件来打开桌面程序;
l 文件类型:设置桌面文件类型关联;
l 浏览器:在AWT画布上嵌入本地浏览器(Internet Explorer或者Mozilla);
l 包装器:把Java Web Start程序转换成本地安装程序的命令行工具;
l 托盘API:支持系统托盘图标和弹出式菜单;
l SaverBeans:Java中的系统屏幕保护;
桌面组件
桌面组件是最简单和可能是最有用的JDIC组件了。它专用于基本的桌面服务,如在正确的编辑器里打开一个文件,新建一封Email,或者把一个URL发送到默认的web浏览器。构建这些东西需要做很多的工作,但使用起来却非常容易。如果你想告诉操作系统打开一个Word文档,调用Desktop.open(new File(“resume.doc”));就可以了,就这么简单。
Org.jdesktop.jdic.desktop包只有三个类:Desktop,Message和DesktopException。Desktop类是静态的不能被实例化。它有几个打开、编辑和打印文件的方法。你也能打开一个新的email和用文本填充它。这就是Message使用的地方,它能让你设置接收人,邮件体,附件,和其他部分。
有关Desktop组件包最好的事就是它用起来是多么地简单。你不需要注册任何特殊的驱动或者修改基于当前平台的配置。这些东西都已经在幕后做好了。只要你的jdic.jar文件在你的类路径中和本地库在你的库路径中(通常你把它和.jar文件放在一起),代码就可以工作了。下边是一个启动一个浏览器的在线例子:
import org.jdesktop.jdic.desktop.*;
import java.net.*;
public class DesktopTest {
public static void main(String[] args)
throws Exception {
Desktop.browse(
new URL("http://www.yahoo.com/")
);
}
}
文件类型组件
JDIC的下一个核心组件是文件类型包,它用来设置文件类型关联。这意味着你能告诉操作系统什么文件用什么程序打开,例如总是用Word打开文本文件而不是用写字板打开。用这个API你能查询、设置和删除基于文件扩展名和mime类型的文件类型关联。
假如那个文件类型通常是某种操作系统上特有的,检索关联或者注册应用本身而不是设置关联时,这个API显得更为有用。例如,在Windows下,通常的文本文件的关联是调用在众所周知的目录下的notepad.exe。在Gnome下,它可能调用/usr/local/bin/gedit。由于这是和系统相关的,除了把java应用绑定到自己文件的类型,设置关联可能不是非常有用。尽管如此,不管你用它做什么,文件类型组件通过处理注册表和MIME类型数据的方式为你处理了所有繁重的工作。
下边是一个设置文件关联的简短的例子:
import org.jdesktop.jdic.filetypes.*;
import java.net.*;
public class FileTypesTest {
public static void main(String[] args)
throws Exception {
Action action = new Action("open",
"C:WINDOWSsystem32
otepad.exe %1");
Association assoc = new Association();
assoc.addFileExtension(".mchat");
assoc.setMimeType("application/mad-chatter");
assoc.addAction(action);
AssociationService svc = new AssociationService();
svc.registerUserAssociation(assoc);
}
}
Main方法的前两行创建了一个将会用notepad.exe打开文件(用%1代替)的Action。之后的四行在action和扩展名为.mchat的文件之间创建了关联。在过去,大多数操作系统专门依赖于文件扩展名或者所有的元数据来确定文件类型。然而在今天,大多数操作系统倾向于为所有文件设置MIME,因此,现在开始使用它是有益的。最后两行实际上是在系统上注册关联。在使用所有的JDIC API时,只要本地库在你的库路径上,让它工作起来你不需要做任何特别的事情。
浏览器组件
JDIC的第三个主要组件是浏览器组件。不象前边的两个,它们只是让你存取系统服务,这个组件给你了一个真正在图形应用里使用的AWT器件。以前,你可以使用第三方的嵌入式组件或纯java的浏览器,但JDIC让你把用户默认的web浏览器嵌入到你的应用中,这些为我们创造了很多机会。现在写一些有全面Web支持的RSS阅读器变成了可能的事情。由于你不必把本地浏览器包含进你的应用中,下载速度也更快了。
浏览器组件API可以让你访问几个浏览器事件以及在历史记录上的控制(向前,后退,刷新)。未来修订的API版本希望能提供更多存取浏览器和任意装载的文档的功能。
在你的应用里使用浏览器组件实在是非常容易:
import org.jdesktop.jdic.browser.*;
import java.net.*;
import javax.swing.*;
public class BrowserTest {
public static void main(String[] args) throws Exception {
WebBrowser browser = new WebBrowser();
browser.setURL(new URL("http://java.net"));
JFrame frame = new JFrame("Browser Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(browser);
frame.pack();
frame.setSize(500,500);
frame.setVisible(true);
}
}
正如你所看到的那样,WebBrowser对象仅仅是一个你可以把它放入一个标准的Jframe中的AWT组件。Main方法的第一行创建了一个新的WebBrowser,第二行设置了你想显示的URL。其他的代码创建了一个frame,把浏览器加入其中,并使得frame可见
记住WebBrowser是个本地AWT组件,因此你可能陷入与Swing结合的困境。混合它们的两个规则是 1)不要让Swing和AWT组件重叠和 2)在你的菜单上调用setLightWeightPopupEnabled(false)否则它们将消失在浏览器组件后边。
浏览器组件将立刻使用用户的默认Web浏览器,它们通常是Internet Explorer或Mozilla。你不能象使用Jrex(http://jrex.mozdev.org/)那样把Mozilla的必须的部分和你的应用绑在一起。这种做法可能在Windows上行得通,IE绝对是可以的,但在Linux上有更多的问题,因为它上边的默认浏览器不一定是Mozilla(例如,在KDE上它可能是Konquorer)。希望这些问题随着项目的成熟能够解决,但目前它对许多项目是很有用的。
包装器组件
不象其他的JDIC,包装器模块不是API,而是把JNLP(Java Web Start)应用转换成本地安装程序(Linux上是rpms,Solaris上是pkgs,Windows上是msis)的一组命令行工具。这不是说象Jsmooth或JexePack那样把你的应用转换成.exe;它仅仅为Web Start应用提供点击安装的功能。在程序安装之后,它将使用JNLP通过Internet更新自己,做Web Start应用能做的所有的其他事情。
包装器组件需要J2SE5.0和本地工具。对Windows而言,你需要安装Microsoft的MSI SDK。一旦你的环境建立了起来,就能使用命令行工具jnlp2msi,jnlp2rpm,和jnlp2pkg把你的Web Start应用转换成与平台相关的安装程序。
系统托盘
托盘图标API曾是一个孵化中项目,但由于java.net社区的勤奋努力,它已经成熟并把它提升到一个完全的JDIC组件的地位。假如你的操作系统有托盘的概念的话,它的目的是在屏幕的右下角创建小程序状态图标。实际上,这种操作系统是指Windows和Linux。Mac OS X用户则没有这个运气。它也支持弹出菜单和为图标提供自动工具提示。象其他JDIC一样,系统托盘支持需要本地代码,但你可以用Java API编码来使用预编译的本地库。
由于这个API使用范围非常小,所以它们只有两个类: SystemTray和TrayIcon。SystemTray类有一个静态工厂方法用于存取系统的默认托盘。TrayIcon让你把一个JpopupMenu和Icon添加到系统托盘的下一个可用的位置上。最后,调用SystemTray.getDefaultSystemTray().addTrayIcon()显示你的弹出菜单。让我们研究一个小例子:
import org.jdesktop.jdic.tray.*;
import java.awt.event.*;
import javax.swing.*;
public class SystemTrayTest {
public static JMenuItem quit;
public SystemTrayTest() {
JPopupMenu menu = new JPopupMenu("My Menu");
menu.add(new JMenuItem("Test 1"));
menu.add(new JMenuItem("Test 2"));
quit = new JMenuItem("Quit");
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.exit(0);
}});
menu.add(quit);
ImageIcon icon = new ImageIcon("duke.gif");
TrayIcon tray_icon = new TrayIcon(icon, "System Tray Test!", menu);
SystemTray tray = SystemTray.getDefaultSystemTray();
tray.addTrayIcon(tray_icon);
}
public static void main(String[] args) {
new SystemTrayTest();
}
}
在SystemTrayTest构造函数的前边的几行我们用三个菜单项创建了一个JpopupMenu。最后一个是quit,增加了一个ActionListener用于退出程序。现在,除了把菜单添加到菜单条上和Jcomponent上外,我们把菜单放进了TrayIcon的构造函数里。显示系统托盘图标的ImageIcon连同工具提示文字也传进了TrayIcon里。最后,我们把TrayIcon添加到默认的SystemTray上,程序就完成了。把tray.jar和tray.dll分别放到类路径和库路径中(通常是工作路径)。
TrayAPI也支持动画GIF图标和左键动作。用这个API,你就能让你的应用程序在你需要的时候才显示在任务条上。
孵化器项目
从一开始,JDIC设计的目的是积极鼓励和开发新的API。为了方便项目的成长,他们创建了孵化器项目,在那里开发人员可以提交他们的代码和试验他们的想法。如果他们的想法不错并实现成熟,项目就可以提升为一个完全的JDIC模块甚至发展成为一个新的项目。
SaverBeans SDK
我过去保留我最喜爱的API。现在,JDIC有一个主要的孵化器项目:一个叫做SaverBeans的创建交差平台屏保的工具包。象其他JDIC一样,你可以用Java做全部编码,让预建好的本地库处理大量的细节。该项目由处理回调的API,一个用于配置的xml文件,和一个用平台支持文件产生平台相关屏幕保护可执行程序(在Windows上是.scr,在Unix上是shell脚本)的Ant任务组成。
写一个屏保要比用其他的API更复杂些,因此我把这部分放在本系列中的第二部分加以描述。然而,如果你想立刻开始学习,你可以下载SDK(https://jdic.dev.java.net/documentation/incubator/screensaver/)和一些社区做好的屏保程序