文档

Java™教程
隐藏目录
如何与桌面类集成
路径: 使用Swing创建GUI
课程: 使用其他Swing特性

如何与Desktop类集成

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枚举实例:

不同的应用程序甚至可以在同一文件类型上注册这些不同的操作。例如,打开操作可能启动Firefox浏览器,编辑操作可能启动Emacs,而打印操作可能启动另一个应用程序。您主机桌面的关联用于确定应该调用哪个应用程序。在JDK 6的当前版本中,无法使用Desktop API来操作桌面文件关联,并且这些关联目前只能使用特定于平台的工具来创建或更改。

以下示例展示了上述功能。


尝试这个:
  1. 编译并运行示例,参考示例索引
  2. DesktopDemo对话框将出现。
    DesktopDemo应用程序。
  3. 在URI文本字段中输入一个URI值,例如 – https://docs.oracle.com/javase/tutorial
  4. 点击“Launch Browser”按钮。
  5. 确保默认浏览器窗口打开并加载了教程的主页。
  6. 将URI更改为任意值,点击“Launch Browser”按钮,并确保成功加载了您请求的网页。
  7. 切换回DesktopDemo对话框,在E-mail文本字段中输入一个邮件收件人名称。您也可以使用支持CC、BCC、SUBJECT和BODY字段的mailto方案,例如 – duke@example.com?SUBJECT=Hello Duke!
  8. 点击“Launch Mail”按钮。
  9. 默认邮件客户端的合成对话框将出现。请确保To和Subject字段如下。
    DesktopDemo应用程序。
  10. 您可以继续撰写邮件或尝试在E-mail字段中输入不同的邮件方案组合。
  11. 切换回DesktopDemo对话框,点击省略号按钮选择任何文本文件。
  12. 选择“打开”、“编辑”或“打印”来设置操作类型,然后点击“Launch Application”按钮。
  13. 确保操作完成正确。尝试其他文件格式,例如.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 API

Desktop类允许Java应用程序启动处理URI或文件的本机桌面应用程序。

方法 目的
isDesktopSupported() 测试当前平台是否支持该类。如果支持,使用getDesktop()方法检索一个实例。
getDesktop() 返回当前浏览器上下文的Desktop实例。在某些平台上,可能不支持桌面 API。可以使用isDesktopSupported()方法确定当前桌面是否受支持。
isSupported(Desktop.Action) 测试当前平台是否支持某个操作。使用Desktop.Action枚举的以下常量:BROWSEEDITMAILOPENPRINT
browse(URI) 启动默认浏览器以显示 URI。如果默认浏览器无法处理指定的 URI,则调用注册为处理指定类型 URI 的应用程序。应用程序由URI类定义的协议和路径确定。
mail(URI) 启动用户默认邮件客户端的邮件撰写窗口,并填充由mailto: URI指定的消息字段。
open(File) 启动关联应用程序以打开文件。
edit(File) 启动关联的编辑器应用程序并打开文件进行编辑。
print(File) 使用关联应用程序的打印命令,通过本地桌面打印功能打印文件。

使用桌面API的示例

下表列出了使用桌面类集成的示例。

示例 描述 注释
DesktopDemo 本节 启动主机系统的默认浏览器并打开指定的URI,启动默认的邮件客户端;打开、编辑或打印文件的应用程序。

上一页: 使用其他Swing功能
下一页: 如何创建半透明和形状窗口