JavaFX Freeze en Desktop.open(archivo), Desktop.browse(uri)
linux netbeans (5)
Encapsularlo en un hilo del sistema:
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());
Estoy ejecutando código en Java en Ubuntu 12.04 LTS 64 Bit (con Gnome Shell), usando Oracle JDK 1.8.0_05 a través de NetBeans8.0.
La siguiente función funciona perfectamente cuando se llama en Main o en un Proyecto Java vacío, sin embargo, cuando se llama desde cualquier aplicación JavaFX, la ventana se congela y deja de responder (aunque el proyecto se ajusta perfectamente), lo que requiere que sea Force Cerrado.
¿Alguien puede sugerir algún problema con lo que he escrito que podría estar causando un problema o un bucle?
Desafortunadamente, debido al modo de falla, no hay ningún mensaje de error que pueda suministrar o analizar.
Cualquier sugerencia recibida con gratitud, gracias de antemano.
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 protected]"));
}
catch (URISyntaxException | IOException e){
System.out.println(e);
}
}
Hay una nueva forma de manejar esto en JavaFX. El único inconveniente que veo es que necesita instanciar un HostServicesDelegate
utilizando HostServicesDelegate
la Application
.
HostServicesDelegate hostServices = HostServicesFactory.getInstance(appInstance);
hostServices.showDocument("http://www.google.com");
Resolví un problema con ...
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();
}
}
}
También tengo este mismo problema. Descubrí que si llamo al método Desktop.open () desde un nuevo hilo, el archivo se abrirá después de cerrar la ventana de la aplicación JavaFX, pero eso no ayuda mucho.
Si pones
SwingUtilities.invokeLater(() -> System.out.println("Hello world"));
en su método principal después de la llamada de inicio (args), tampoco se llamará hasta después de cerrar la aplicación JavaFX.
Parece que hay algún tipo de problema de concurrencia entre la aplicación JavaFX y Swing.
En Ubuntu puedes probar
xdg-open filename
desde tu aplicación JavaFX.
Por lo que puedo decir, tu código debería funcionar.
También tuve el mismo problema y esta solución funciona para mí:
if( Desktop.isDesktopSupported() )
{
new Thread(() -> {
try {
Desktop.getDesktop().browse( new URI( "http://..." ) );
} catch (IOException | URISyntaxException e1) {
e1.printStackTrace();
}
}).start();
}