Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Использование Других Функций Swing
Как Интегрировать с Настольным Классом
Домашняя страница > Создание GUI С JFC/Swing > Использование Других Функций Swing

Как Интегрировать с Настольным Классом

Java™ Standard Edition версия 6 сужает разрыв между производительностью и интеграцией собственных приложений и приложений Java. Наряду с новой функциональностью системного лотка, поддержкой экрана-заставки, и печатью с расширенными возможностями для JTables, Java версия 6 SE обеспечивает Настольный API (java.awt.Desktop) API, который позволяет приложениям Java взаимодействовать с приложениями значения по умолчанию, связанными с определенными типами файла на платформе узла.

Новая функциональность обеспечивается Desktop class. API является результатом Компонентов Интеграции JDesktop (JDIC) проект. Цель проекта JDIC состоит в том, чтобы сделать "Java основанными на технологии приложениями первые-class граждане" рабочего стола, включая интеграции без шва. JDIC предоставляет приложениям Java доступ к функциональности и услугам, предоставленным собственным рабочим столом. Относительно нового Настольного API это означает, что приложение Java может выполнить следующие операции:


Отметьте: 

Настольный API использует ассоциации файла операционной системы узла, чтобы запустить приложения, связанные с определенными типами файла. Например, если текст OpenDocument (.odt) расширения файла связывается с приложением Писателя OpenOffice, приложение Java могло запустить Писателя OpenOffice, чтобы открыть, отредактировать, или даже напечатать файлы с той ассоциацией. В зависимости от хост-системы различные приложения могут быть связаны с различными действиями. Например, если определенный файл не может быть напечатан, проверьте сначала, есть ли у его расширения ассоциация печати на данной операционной системе.


Используйте isDesktopSupported() метод, чтобы определить, доступен ли Настольный API. На Операционной системе Соляриса и платформе Linux, этот API зависит от библиотек Gnome. Если те библиотеки будут недоступны, то этот метод возвратит false. После определения, что Настольный API поддерживается, то есть, isDesktopSupported() возвращает true, приложение может получить a Desktop экземпляр используя статический метод getDesktop().

Если приложение работает в среде без клавиатуры, мыши, или монитора ("бездисплейная" среда), getDesktop() метод бросает a java.awt.HeadlessException.

После того, как полученный, Desktop экземпляр позволяет приложению просматривать, отправлять по почте, открывать, редактировать, или даже печатать файл или URI, но только если полученный Desktop экземпляр поддерживает эти действия. Каждое из этих действий вызывают действием, и каждый представляется как a Desktop.Action экземпляр перечисления:

Различные приложения могут быть зарегистрированы для этих различных действий даже на том же самом типе файла. Например, браузер Firefox может быть запущен для ОТКРЫТОГО действия, Emacs для действия РЕДАКТИРОВАНИЯ, и все же различного приложения для действия ПЕЧАТИ. Ваши настольные ассоциации узла используются, чтобы определить, какое приложение должно быть вызвано. Возможность управлять ассоциациями файла на рабочем столе не возможна с текущей версией Настольного API в JDK 6, и те ассоциации могут быть созданы или изменены только с зависимыми от платформы инструментами в это время.

Следующий пример показывает упомянутые выше возможности.


Попробуйте это: 
  1. Скомпилируйте и выполните пример, консультируйтесь, пример индексируют.
  2. Диалоговое окно DesktopDemo появится.
    Приложение DesktopDemo.
  3. Введите значение URI в текстовое поле URI, например – http://docs.oracle.com/javase/tutorial.
  4. Нажмите кнопку Launch Browser.
  5. Гарантируйте, что окно браузера значения по умолчанию открывается и Учебное руководство, основная страница загружается.
  6. URI изменения к произвольному значению, нажмите кнопку Launch Browser, и гарантируйте, что веб-страница, которую Вы запрашивали, загружается успешно.
  7. Переключитесь назад на диалоговое окно DesktopDemo и введите имя адресата в текстовом поле E-mail. Можно также использовать mailto схема, поддерживающая CC, BCC, ПРЕДМЕТ, и поля BODY, например – duke@example.com?SUBJECT=Hello Duke!.
  8. Нажмите кнопку Launch Mail.
  9. Составляющее композит диалоговое окно почтового клиента значения по умолчанию появится. Убедитесь, что К и Предметные области следующие.
    Приложение DesktopDemo.
  10. Можно продолжать составлять сообщение или пытаться ввести различные комбинации почтовой схемы в поле E-mail.
  11. Переключитесь назад на диалоговое окно DesktopDemo и нажмите кнопку замещающего знака, чтобы выбрать любой текстовый файл.
  12. Выберите или Открытый, Редактирование, или Печать, чтобы установить тип работы, затем нажмите кнопку Launch Application.
  13. Убедитесь, что работа завершается правильно. Попробуйте другие форматы файлов, например .odt, .html, .pdf. Отметьте: Если Вы пытаетесь отредактировать .pdf файл, DesktopDemo возвращает следующее сообщение: Cannot perform the given operation to the <file name> file

Следующие фрагменты кода обеспечивают больше деталей о реализации приложения DeskDemo. Конструктор DesktopDemo отключает немного компонентов прямо после инстанцирования UI и проверяет, доступен ли Настольный API.

 public DesktopDemo() {
        // init all gui components
        initComponents();
        // disable buttons that launch browser, email client,
        // disable buttons that open, edit, print files
        disableActions();
        // before any Desktop APIs are used, first check whether the API is
        // supported by this particular VM on this particular host
        if (Desktop.isDesktopSupported()) {
            desktop = Desktop.getDesktop();
            // now enable buttons for actions that are supported.
            enableSupportedActions();
        }
        ...

    /**
     * Disable all graphical components until we know
     * whether their functionality is supported.
     */
    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);        
    }
    

   ...

Как только Объект рабочего стола получается, можно запросить объект узнать, какие определенные действия поддерживаются. Если Объект рабочего стола не поддерживает определенные действия, или если сам настольный API неподдерживается, DesktopDemo просто сохраняет графические компоненты, на которые влияют, отключенными.

/**
     * Enable actions that are supported on this host.
     * The actions are the following: open browser, 
     * open email client, and open, edit, and print
     * files using their associated application.
     */
    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) метод может бросить множество исключений, включая NullPointerException, если URI является нулем, и 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("The system cannot find the " + uri + 
                " file specified");
            //ioe.printStackTrace();
        } catch(URISyntaxException use) {
            System.out.println("Illegal character in path");
            //use.printStackTrace();
        }
    }

Приложения могут запустить почтовый клиент значения по умолчанию узла, если то действие поддерживается, вызывая 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 могут открыть, отредактировать, и напечатать файлы из своего связанного приложения, используя open(), edit(), и print() методы Desktop class, соответственно.

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("Cannot perform the given operation 
                to the " + file + " file");
        }
    }

Полный код для этого демонстрационного примера доступен в DesktopDemo.java файл.

Настольный API

Desktop class позволяет приложениям Java запускать собственные настольные приложения, которые обрабатывают URI или файлы.

Метод Цель
isDesktopSupported () Тесты, поддерживается ли этот class на текущей платформе. Если это поддерживается, использовать getDesktop() получать экземпляр.
getDesktop () Возвраты Desktop экземпляр текущего контекста браузера. На некоторых платформах не может поддерживаться Настольный API. Используйте isDesktopSupported() метод, чтобы определить, поддерживается ли текущий рабочий стол.
isSupported (Рабочий стол. Действие) Тесты, поддерживается ли действие на текущей платформе. Используйте следующий constans Desktop.Action перечисление: BROWSE, EDIT, MAIL, OPEN, PRINT.
обзор (URI) Запускает браузер значения по умолчанию, чтобы вывести на экран URI. Если браузер значения по умолчанию не в состоянии обработать указанный URI, приложение, зарегистрированное для того, чтобы обработать URI указанного типа, вызывается. Приложение определяется из протокола и пути URI, как определено URI class.
почта (URI) Запускает почтовое окно создания пользовательского почтового клиента значения по умолчанию, заполняя поля сообщения, определенные a mailto: URI.
открытый (Файл) Запускает связанное приложение, чтобы открыть файл.
редактирование (Файл) Запускает связанное приложение редактора и открывает файл для того, чтобы отредактировать.
печать (Файл) Печатает файл с собственным настольным средством печати, используя команду печати связанного приложения.

Примеры Тот Настольный API Использования

Следующая таблица приводит пример, который использует Рабочий стол интеграция class.

Пример Где Описано Примечания
DesktopDemo Этот раздел Запускает браузер значения по умолчанию хост-системы с указанным URI и почтовым клиентом значения по умолчанию; запускает приложение, чтобы открыть, отредактировать, или напечатать файл.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Использование Других Функций Swing
Следующая страница: Как к Windows Create Translucent и Shaped