JavaFX Freeze on Desktop.open(file), Desktop.browse(uri)

后端 未结 5 729
滥情空心
滥情空心 2020-12-09 16:13

I\'m running some code in Java on Ubuntu 12.04 LTS 64 Bit (with Gnome Shell), using Oracle JDK 1.8.0_05 via NetBeans8.0.

The following function works perfectly when

相关标签:
5条回答
  • 2020-12-09 16:50

    I also have this same problem. I found out that if I call the Desktop.open() method from a new thread, the file will open after I close the JavaFX application window, but that doesn't help much.

    If you put

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

    in to your main method after your launch(args) call, it also won't get called until after you close the JavaFX application.

    It seems like there's some kind of concurrency issue between the JavaFX application and Swing.

    On Ubuntu you can try

    xdg-open filename
    

    from your JavaFX app.

    As far as I can tell, your code should work.

    0 讨论(0)
  • 2020-12-09 16:59

    Encapsulate it on a System thread:

        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());
    
    0 讨论(0)
  • 2020-12-09 17:04

    I resolved problem with...

     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();
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-12-09 17:12

    There is a new way to handle this in JavaFX. The only downside I see is you need to instantiate a HostServicesDelegate using the Application singleton.

    HostServicesDelegate hostServices = HostServicesFactory.getInstance(appInstance);
    hostServices.showDocument("http://www.google.com");
    
    0 讨论(0)
  • 2020-12-09 17:14

    I also had the same problem and this solution works for me:

    if( Desktop.isDesktopSupported() )
    {
        new Thread(() -> {
               try {
                   Desktop.getDesktop().browse( new URI( "http://..." ) );
               } catch (IOException | URISyntaxException e1) {
                   e1.printStackTrace();
               }
           }).start();
    }
    
    0 讨论(0)
提交回复
热议问题