我在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);
}
}
答案 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());