Как открыть пользовательский системный редактор для данного файла?

Я пытаюсь выяснить, как открыть системный редактор для данного файла.

Скажем, у нас есть файловый менеджер, написанный на Java. Пользователь заходит в папку и видит список файлов. И, например, есть файл Icon.jpg, Пользователь дважды щелкает имя файла, и файл открывается в редакторе системы (например, Gimp). Главный вопрос - как это сделать?

Мы можем Runtime.getRuntime().exec("something file"), но таким образом вы должны знать, какая программа предпочтительнее в пользовательской среде. Но как?

Мы также можем сделать Desktop.getDesktop().edit(File file), но таким образом мы не можем отслеживать процесс и не можем знать, что этот дочерний процесс закрыт. Другая проблема - функция не работает в Linux (по крайней мере, в Ubuntu 8.10). Существует также Desktop.getDesktop().open(File file), но это заставляет открыть средство просмотра файлов вместо системного средства просмотра для этого типа файлов.

Я ищу решение всю неделю, но не нашел подходящего и универсального. Знаете ли вы другие подходы к этому вопросу? Для моего проекта было бы достаточно, если бы он работал на Windows+Linux+Mac.

Спасибо за ваши ответы и советы.

Редактировать на 2009-02-08 23:04

Другое предложение: могу ли я вызвать окно "Выбор приложения" в Windows и в Linux, как в Mac с "открытым файлом"? Например, когда вы пытаетесь открыть файл, вас просят выбрать приложение из списка предпочтительных для системы? (что-то вроде "Открыть с помощью..." в проводнике Windows). Вы знаете?

5 ответов

Решение

Кажется, что если вы не можете использовать java.awt.Desktop Вы должны различать ОС: Windows:

RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL <file.ext>

Linux:

edit <file.ext>

Mac:

open <file.ext>

НТН. Очевидно, что это не очень портативный...

Проверьте объект java.awt.Desktop. В вашем случае вы хотите призвать edit()

Если вы хотите убедиться, что данная платформа поддерживает этот вызов, то вы можете сделать что-то вроде следующего (я не проверял этот код):

public boolean editFile(final File file) {
  if (!Desktop.isDesktopSupported()) {
    return false;
  }

  Desktop desktop = Desktop.getDesktop();
  if (!desktop.isSupported(Desktop.Action.EDIT)) {
    return false;
  }

  try {
    desktop.edit(file);
  } catch (IOException e) {
    // Log an error
    return false;
  }

  return true;
}

Это не кроссплатформенный, но на Mac OS X вы можете сделать

Runtime.getRuntime().exec("open filename");

open(1) исполняемый файл использует LaunchServices, чтобы выбрать правильную программу для выполнения, а затем использует ее для открытия файла с именем filename,

Для приложений JavaFX мы можем использовать HostServices. Этот вопрос касается того, как использовать HostServices. Это должно работать на Ubuntu (проверено)/Windows (не проверено) и Mac (не проверено).

      import java.io.File;
import java.io.IOException;
public class App extends Application {
}

File file = new File("/your/file/path");
HostServices hostServices = getHostServices();
hostServices.showDocument(file.getAbsolutePath());

getHostServices() — это метод класса приложения JavaFX.

Это будет работать в Windows

Runtime.getRuntime().exec( "CMD /C START filename.ext " );
Другие вопросы по тегам