[英]JavaFX Freeze on Desktop.open(file), Desktop.browse(uri)
我正在 Ubuntu 12.04 LTS 64 位(使用 Gnome Shell)上运行一些 Java 代码,通过 NetBeans8.0 使用 Oracle JDK 1.8.0_05。
以下函数在 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);
}
}
我也遇到了同样的问题,这个解决方案对我有用:
if( Desktop.isDesktopSupported() )
{
new Thread(() -> {
try {
Desktop.getDesktop().browse( new URI( "http://..." ) );
} catch (IOException | URISyntaxException e1) {
e1.printStackTrace();
}
}).start();
}
我用...解决了问题
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();
}
}
}
我也有同样的问题。 我发现如果我从一个新线程调用 Desktop.open() 方法,在我关闭 JavaFX 应用程序窗口后文件将打开,但这并没有多大帮助。
如果你把
SwingUtilities.invokeLater(() -> System.out.println("Hello world"));
在您的 launch(args) 调用之后进入您的 main 方法,在您关闭 JavaFX 应用程序之前它也不会被调用。
JavaFX 应用程序和 Swing 之间似乎存在某种并发问题。
在 Ubuntu 上你可以试试
xdg-open filename
来自您的 JavaFX 应用程序。
据我所知,您的代码应该可以工作。
在 JavaFX 中有一种新的方法来处理这个问题。 我看到的唯一缺点是您需要使用Application
单例实例化HostServicesDelegate
。
HostServicesDelegate hostServices = HostServicesFactory.getInstance(appInstance);
hostServices.showDocument("http://www.google.com");
将其封装在系统线程上:
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.