如果你的应用程序在调用getDesktop()之前不使用isDesktopSupported()进行API支持检查,那么它必须准备捕获一个UnsupportedOperationException异常-当你的应用程序在一个不支持这种特性的平台上请求一个Desktop实例时将抛出这种异常。另外,如果你的应用程序运行于一种无键盘、鼠标和监视器环境下,该getDesktop()方法将抛出一个java.awt.HeadlessException异常。
一旦检索完毕,该Desktop实例即允许你的应用程序浏览、邮寄、打开、编辑或甚至打印一个文件或URI,但是只有在被检索的Desktop实例支持这些活动的前提下才行。每个这些活动被称为一个行为(Action),并且每一个行为被描述为一个Desktop.Action枚举实例:
◆BROWSE-描述主机的默认浏览器执行的一种浏览行为
◆MAIL-描述主机的默认电子邮件客户端执行的一种邮件行为
◆OPEN-描述一种与打开一特定的文件类型相关联的应用程序执行的打开行为
◆EDIT-描述一种与编辑一特定的文件类型相关联的应用程序执行的编辑行为
◆PRINT-描述一种与打印一特定的文件类型相关联的应用程序执行的打印行为
在调用任何这些行为之前,一个应用程序必须确定是否该Desktop实例支持它们。这与确定是否一个Desktop实例可用是有所不同的。这个Desktop.isDesktopSupported()方法告诉你是否能够创建一个实例。一旦获得一个Desktop对象,你就可以查询该对象来确定支持哪些特定类型的行为。如果该Desktop对象不支持特定的行为,或如果该桌面API本身并不被支持,那么DesktopDemo简单地停用那些受影响的图形组件。如图2所示,在停用状态下,不能使用这些组件来调用桌面特性。

图2:当不支持桌面API时图形组件被停用
通过使用一个新的Desktop实例,下列代码检查负责是否支持Desktop.Action并且启用适当的图形组件:
public DesktopDemo() { ... //在使用更多的桌面API前,首先检查 //是否这种API为该特定主机上的特别的虚拟机所支持。 if (Desktop.isDesktopSupported()) { desktop = Desktop.getDesktop(); // 现在,启用按钮以实现被支持的行为 enableSupportedActions(); } ... } /** *启用在该主机上被支持的行为。 *这些行为有:打开浏览器, *打开电子邮件客户端,和使用它们相关联的应用程序打开,编辑与打印文件。 */ private void enableSupportedActions() { if (desktop.isSupported(Desktop.Action.BROWSE)) { txtBrowserURI.setEnabled(true); btnLaunchBrowser.setEnabled(true); } if (desktop.isSupported(Desktop.Action.MAIL)) { txtMailTo.setEnabled(true); btnLaunchEmail.setEnabled(true); } if (desktop.isSupported(Desktop.Action.OPEN)) { rbOpen.setEnabled(true); } if (desktop.isSupported(Desktop.Action.EDIT)) { rbEdit.setEnabled(true); } if (desktop.isSupported(Desktop.Action.PRINT)) { rbPrint.setEnabled(true); } if (rbEdit.isEnabled() || rbOpen.isEnabled() || rbPrint.isEnabled()) { txtFile.setEnabled(true); btnLaunchApplication.setEnabled(true); } }
|
一旦该应用程序确定了被支持的行为,它即启用适当的图形组件。如果所有的组件都被启用,那么相应的UI应该看上去如图3所示。

图3:当支持桌面API时,启用组件
四、打开浏览器
调用下列实例方法将打开你的主机的默认浏览器:
public void browse(URI uri) throws IOException
|
因为仅当支持相关联的Desktop.ActionDesktopDemo时,UI组件才被启用,所以,在实际调用browse()方法之前,这个简单的演示应用程序不需要进行行为支持检查。然而,在每一种调用之前检查行为支持在实际中将增加程序的健壮性:
if (desktop.isSupported(Desktop.Action.BROWSE)) { //启动浏览器 ... }
|
DesktopDemo把一个java.awt.event.ActionListener添加到每一个按钮上。当被启用时,“Launch Browser”按钮通过它的ActionListener调用下列方法:
private void onLaunchBrowser(java.awt.event.ActionEvent evt) { URI uri = null; try { uri = new URI(txtBrowserURI.getText()); desktop.browse(uri); } catch(IOException ioe) { ioe.printStackTrace(); } catch(URISyntaxException use) { use.printStackTrace(); } ... }
|