本Java教程适用于JDK 8。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项的信息,请参见JDK发行说明。
Java™ Standard Edition 6版本缩小了本地应用程序和Java应用程序之间的性能和集成差距。除了新的系统托盘功能、启动画面支持和增强的JTables打印功能外,Java SE 6还提供了桌面API(java.awt.Desktop),它允许Java应用程序与主机平台上与特定文件类型关联的默认应用程序进行交互。
新增功能由Desktop类提供。该API源自JDesktop Integration Components(JDIC)项目。JDIC项目的目标是使"基于Java技术的应用程序成为桌面的一等公民",实现无缝集成。JDIC为Java应用程序提供了访问本机桌面提供的功能和设施。就新的桌面API而言,这意味着Java应用程序可以执行以下操作:
桌面API使用主机操作系统的文件关联来启动与特定文件类型关联的应用程序。例如,如果OpenDocument文本(.odt)文件扩展名与OpenOffice Writer应用程序相关联,Java应用程序可以启动OpenOffice Writer来打开、编辑甚至打印具有该关联的文件。根据主机系统的不同,不同的应用程序可能与不同的操作关联。例如,如果某个文件无法打印,请首先检查其扩展名在给定操作系统上是否具有打印关联。
使用isDesktopSupported()方法确定是否可用桌面API。在Solaris操作系统和Linux平台上,此API依赖于Gnome库。如果这些库不可用,此方法将返回false。在确定支持桌面API(即isDesktopSupported()返回true)后,应用程序可以使用静态方法getDesktop()检索Desktop实例。
如果应用程序在没有键盘、鼠标或显示器的环境中运行("无头"环境),getDesktop()方法会抛出java.awt.HeadlessException。
一旦获取到Desktop实例,应用程序可以浏览、发送邮件、打开、编辑甚至打印文件或URI,但前提是获取到的Desktop实例支持这些操作。每个操作被称为一个动作,每个动作都表示为一个Desktop.Action枚举实例:
BROWSE — 表示由主机的默认浏览器执行的浏览操作。MAIL — 表示由主机的默认电子邮件客户端执行的邮件操作。OPEN — 表示由与打开特定文件类型相关联的应用程序执行的打开操作。EDIT — 表示由与编辑特定文件类型相关联的应用程序执行的编辑操作。PRINT — 表示由与打印特定文件类型相关联的应用程序执行的打印操作。不同的应用程序甚至可以在同一文件类型上注册这些不同的操作。例如,打开操作可能启动Firefox浏览器,编辑操作可能启动Emacs,而打印操作可能启动另一个应用程序。您主机桌面的关联用于确定应该调用哪个应用程序。在JDK 6的当前版本中,无法使用Desktop API来操作桌面文件关联,并且这些关联目前只能使用特定于平台的工具来创建或更改。
以下示例展示了上述功能。
https://docs.oracle.com/javase/tutorial。mailto方案,例如 – duke@example.com?SUBJECT=Hello Duke!。
.odt、.html、.pdf。注意:如果尝试编辑.pdf文件,DesktopDemo将返回以下消息:无法对文件<文件名>执行给定操作以下代码片段提供了有关DeskDemo应用程序实现的更多详细信息。DesktopDemo构造函数在实例化UI后禁用了一些组件,并检查Desktop API是否可用。
public DesktopDemo() {
// 初始化所有GUI组件
initComponents();
// 禁用打开浏览器、邮件客户端的按钮
// 禁用打开、编辑、打印文件的按钮
disableActions();
// 在使用任何Desktop API之前,首先检查该特定VM在该特定主机上是否支持API
if (Desktop.isDesktopSupported()) {
desktop = Desktop.getDesktop();
// 现在启用支持的操作的按钮。
enableSupportedActions();
}
...
/**
* 在了解其功能是否被支持之前,禁用所有图形组件。
*/
private void disableActions() {
txtBrowserURI.setEnabled(false);
btnLaunchBrowser.setEnabled(false);
txtMailTo.setEnabled(false);
btnLaunchEmail.setEnabled(false);
rbEdit.setEnabled(false);
rbOpen.setEnabled(false);
rbPrint.setEnabled(false);
txtFile.setEnabled(false);
btnLaunchApplication.setEnabled(false);
}
...
一旦获得了Desktop对象,您可以查询该对象以了解支持哪些具体操作。如果Desktop对象不支持特定操作,或者Desktop API本身不受支持,DesktopDemo将保持受影响的图形组件禁用。
/**
* 启用此主机支持的操作。
* 这些操作包括:打开浏览器、打开电子邮件客户端,以及使用关联应用程序打开、编辑和打印文件。
*/
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);
}
}
browse(uri)方法可能会抛出多种异常,包括当URI为null时抛出NullPointerException,当不支持BROWSE操作时抛出UnsupportedOperationException。如果默认浏览器或应用程序无法找到或启动,该方法可能会抛出IOException,如果安全管理器拒绝调用,则可能会抛出SecurityException。
private void onLaunchBrowser(ActionEvent evt) {
URI uri = null;
try {
uri = new URI(txtBrowserURI.getText());
desktop.browse(uri);
} catch(IOException ioe) {
System.out.println("系统找不到指定的文件:" + uri);
//ioe.printStackTrace();
} catch(URISyntaxException use) {
System.out.println("路径中有非法字符");
//use.printStackTrace();
}
}
如果该操作被支持,应用程序可以通过调用此Desktop实例的mail(uriMailTo)方法来启动主机的默认电子邮件客户端。
private void onLaunchMail(ActionEvent evt) {
String mailTo = txtMailTo.getText();
URI uriMailTo = null;
try {
if (mailTo.length() > 0) {
uriMailTo = new URI("mailto", mailTo, null);
desktop.mail(uriMailTo);
} else {
desktop.mail();
}
} catch(IOException ioe) {
ioe.printStackTrace();
} catch(URISyntaxException use) {
use.printStackTrace();
}
}
Java应用程序可以使用Desktop类的open()、edit()和print()方法来打开、编辑和打印与其关联的应用程序中的文件。
private void onLaunchDefaultApplication(ActionEvent evt) {
String fileName = txtFile.getText();
File file = new File(fileName);
try {
switch(action) {
case OPEN:
desktop.open(file);
break;
case EDIT:
desktop.edit(file);
break;
case PRINT:
desktop.print(file);
break;
}
} catch (IOException ioe) {
//ioe.printStackTrace();
System.out.println("无法对文件" + file + "执行给定的操作");
}
}
此演示的完整代码可以在DesktopDemo.java文件中找到。
Desktop类允许Java应用程序启动处理URI或文件的本机桌面应用程序。
| 方法 | 目的 |
|---|---|
| isDesktopSupported() | 测试当前平台是否支持该类。如果支持,使用getDesktop()方法检索一个实例。 |
| getDesktop() | 返回当前浏览器上下文的Desktop实例。在某些平台上,可能不支持桌面 API。可以使用isDesktopSupported()方法确定当前桌面是否受支持。 |
| isSupported(Desktop.Action) | 测试当前平台是否支持某个操作。使用Desktop.Action枚举的以下常量:BROWSE,EDIT,MAIL,OPEN,PRINT。 |
| browse(URI) | 启动默认浏览器以显示 URI。如果默认浏览器无法处理指定的 URI,则调用注册为处理指定类型 URI 的应用程序。应用程序由URI类定义的协议和路径确定。 |
| mail(URI) | 启动用户默认邮件客户端的邮件撰写窗口,并填充由mailto: URI指定的消息字段。 |
| open(File) | 启动关联应用程序以打开文件。 |
| edit(File) | 启动关联的编辑器应用程序并打开文件进行编辑。 |
| print(File) | 使用关联应用程序的打印命令,通过本地桌面打印功能打印文件。 |
下表列出了使用桌面类集成的示例。
| 示例 | 描述 | 注释 |
|---|---|---|
DesktopDemo |
本节 | 启动主机系统的默认浏览器并打开指定的URI,启动默认的邮件客户端;打开、编辑或打印文件的应用程序。 |