当我尝试拨打Desktop.getDesktop().open()
时,我的程序崩溃了。
我使用的是Ubuntu GNOME 16.10,运行Gnome 3.20.4。我没有机会在另一个平台上测试这个代码,但是在这个平台上它肯定会崩溃程序。
browseMenuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Platform.runLater( new Runnable() {
public void run() {
try {
System.out.println ( Desktop.isDesktopSupported() );
Desktop.getDesktop().open( albumTable.getSelectionModel().getSelectedItem().getPath().toFile() );
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
});
有关如何修复或解决此问题的任何想法?
答案 0 :(得分:4)
您正在混合使用JavaFX和AWT,这可能会导致问题。而不是
Desktop.getDesktop().open(file);
尝试使用JavaFX API:
getHostServices().showDocument(file.toURI().toString());
Application
中定义了 getHostServices()
(因此您可能需要在start方法中检索它并将其传递给任何对象 - 可能是控制器 - 使用菜单项注册侦听器)。 / p>
答案 1 :(得分:0)
看起来@ James_D的答案是更好的做事方式,但目前(截至2017/05/03)它不适用于OpenJDK / OpenJFK。
值得庆幸的是,他关于混合使用JFX和Swing的评论帮助我找到了适用于OpenJDK / OpenJFX的解决方案:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
Desktop.getDesktop().open( albumTable.getSelectionModel().getSelectedItem().getPath().toFile() );
} catch (IOException e) {
e.printStackTrace();
}
}
});
诀窍是使用SwingUtilities.invokeLater()
而不是Platform.runLater()
,因为里面的代码是摆动的。