如何在OnAction Event方法(无头图形环境)中打开默认文本编辑器中的文件



我正在尝试使用此功能打开按钮单击javafx中的文件。

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

但是它在java.awt.desktop.getdesktop exception中给出了 java.awt.headlessexception。

有什么方法可以在无头环境中打开文件?

一次尝试是将无头禁用一段时间,打开文件并最终再次启用它。类似:

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 OS(我不知道 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();

最新更新