23

我正在通过 NetBeans8.0 使用 Oracle JDK 1.8.0_05 在 Ubuntu 12.04 LTS 64 位(带有 Gnome Shell)上运行 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);
            }
}
4

5 回答 5

40

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

if( Desktop.isDesktopSupported() )
{
    new Thread(() -> {
           try {
               Desktop.getDesktop().browse( new URI( "http://..." ) );
           } catch (IOException | URISyntaxException e1) {
               e1.printStackTrace();
           }
       }).start();
}
于 2015-12-23T05:16:22.110 回答
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();
        }
    }

}
于 2015-06-11T20:02:28.280 回答
2

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

如果你把

SwingUtilities.invokeLater(() -> System.out.println("Hello world"));

在您的 launch(args) 调用之后进入您的 main 方法,在您关闭 JavaFX 应用程序之前它也不会被调用。

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

在 Ubuntu 上你可以试试

xdg-open filename

从您的 JavaFX 应用程序。

据我所知,您的代码应该可以工作。

于 2014-04-27T08:05:27.667 回答
1

在 JavaFX 中有一种新的方法来处理这个问题。我看到的唯一缺点是您需要HostServicesDelegate使用Application单例实例化 a 。

HostServicesDelegate hostServices = HostServicesFactory.getInstance(appInstance);
hostServices.showDocument("http://www.google.com");
于 2014-08-13T09:33:33.160 回答
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());
于 2015-06-23T07:32:56.737 回答