JavaFX和getDesktop()。open()崩溃了程序

时间:2017-05-03 10:35:28

标签: java javafx awt gnome

当我尝试拨打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();
                }
            }
        });
    }
});

有关如何修复或解决此问题的任何想法?

2 个答案:

答案 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(),因为里面的代码是摆动的。