Как открыть файл в текстовом редакторе по умолчанию в методе события onAction (среда Headless Graphics) - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь открыть файл по событию нажатия кнопки в JavaFx, используя это.

java.awt.Desktop.getDesktop().open(File f);

, но это дает java.awt.HeadlessException в java.awt.Desktop.getDesktop исключение.

Есть ли способ открыть файл в автономной среде?.

1 Ответ

1 голос
/ 12 мая 2019

Одной из попыток было бы отключить безголовый на некоторое время, открыть файл и, наконец, включить его снова. Что-то вроде:

System.setProperty("java.awt.headless", "true"); // assume it is enabled somewhere
File desktop = new File(System.getProperty("user.home"), "Desktop");
File text = new File(desktop, "a.txt");
System.setProperty("java.awt.headless", "false");
Desktop.getDesktop().open(text);
System.setProperty("java.awt.headless", "true");

Однако иногда System.setProperty("java.awt.headless", "false"); недостаточно для отключения свойства без заголовка. Одним из решений dirty было бы изменить его значение с помощью reflect.

System.setProperty("java.awt.headless", "true"); // assume it is enabled somewhere
File desktop = new File(System.getProperty("user.home"), "Desktop");
File text = new File(desktop, "a.txt");
setHeadless(false);
Desktop.getDesktop().open(text);
setHeadless(true);
Desktop.getDesktop().open(text);

с setHeadless метод:

private static void setHeadless(boolean enabled) {
    try {
        Field defaultHeadlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("defaultHeadless");
        defaultHeadlessField.setAccessible(true);
        defaultHeadlessField.set(null, enabled);
        Field headlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("headless");
        headlessField.setAccessible(true);
        headlessField.set(null, enabled);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
}

Вторая попытка (и еще больше «форсирование») будет открывать ее через командную строку. Для Windows ОС (я не знаю о Linux / MacOS ) будет:

File desktop = new File(System.getProperty("user.home"), "Desktop");
File text = new File(desktop, "a.txt");

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd.exe", "/c", text.getAbsolutePath()).start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...