浏览器组件

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("//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(//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更复杂些,因此我把这部分放在本系列中的第二部分加以描述。