Desktop.open(文件),Desktop.browse(uri)上的JavaFX Freeze

时间:2014-04-19 23:10:22

标签: java linux netbeans javafx gnome-3

我在Ubuntu 12.04 LTS 64 Bit(使用Gnome Shell)上使用Java JDK 1.8.0_05通过NetBeans8.0在Java中运行一些代码。

当在Main或其他空Java项目中调用时,以下函数可以正常工作,但是当从任何JavaFX应用程序调用时,它会导致窗口冻结并停止响应(尽管项目完全符合要求),要求它是强制关闭。

任何人都可以提出我所写的可能导致问题或循环的任何问题吗?

唉,由于失败的模式,我没有提供或分析的错误信息。

感谢任何建议,提前谢谢。

   public static void desktopTest(){

            Desktop de = Desktop.getDesktop();

            try {
                de.browse(new URI("http://stackoverflow.com"));
            }
            catch (IOException | URISyntaxException e) {
                System.out.println(e);
            }

            try {
                de.open(new File("/home/aaa/file.ext"));
            }
            catch (IOException e){
                System.out.println(e);
            }
            try {
                de.mail(new URI("mailto:email@example.com"));
            }
            catch (URISyntaxException | IOException e){
                System.out.println(e);
            }
}

5 个答案:

答案 0 :(得分:31)

我也有同样的问题,这个解决方案对我有用:

if( Desktop.isDesktopSupported() )
{
    new Thread(() -> {
           try {
               Desktop.getDesktop().browse( new URI( "http://..." ) );
           } catch (IOException | URISyntaxException e1) {
               e1.printStackTrace();
           }
       }).start();
}

答案 1 :(得分:3)

我解决了......的问题。

 public static void abrirArquivo(File arquivo) {
    if (arquivo != null) {
        if (arquivo.exists()) {
            OpenFile openFile = new OpenFile(arquivo);
            Thread threadOpenFile = new Thread(openFile);
            threadOpenFile.start();
        }
    }
}

private static class OpenFile implements Runnable {

    private File arquivo;

    public OpenFile(File arquivo) {
        this.arquivo = arquivo;
    }

    private void abrirArquivo(File arquivo) throws IOException {

        if (arquivo != null) {
            java.awt.Desktop.getDesktop().open(arquivo);
        }

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            abrirArquivo(arquivo);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

答案 2 :(得分:2)

我也有同样的问题。我发现如果我从一个新线程调用Desktop.open()方法,该文件将在之后打开我关闭JavaFX应用程序窗口,但这没有多大帮助。

如果你把

SwingUtilities.invokeLater(() -> System.out.println("Hello world"));
在启动(args)调用之后

进入main方法,直到关闭JavaFX应用程序之后才会调用它。

似乎JavaFX应用程序和Swing之间存在某种并发问题。

在Ubuntu上,您可以尝试

xdg-open filename

来自您的JavaFX应用程序。

据我所知,你的代码工作。

答案 3 :(得分:1)

在JavaFX中有一种新方法可以解决这个问题。我看到的唯一缺点是你需要使用HostServicesDelegate单例来实例化Application

HostServicesDelegate hostServices = HostServicesFactory.getInstance(appInstance);
hostServices.showDocument("http://www.google.com");

答案 4 :(得分:1)

将其封装在系统线程上:

    final String url = "www.google.com";
    final Hyperlink hyperlink = new Hyperlink("Click me");
        hyperlink.setOnAction(event -> new Thread(() -> {
            try {
                Desktop.getDesktop().browse(new URI(url));
            } catch (IOException | URISyntaxException e1) {
                e1.printStackTrace();
            }
        }).start());