我正在尝试使用此功能打开按钮单击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();