【问题标题】:How can I open the default system browser from a java fx application?如何从 javafx 应用程序打开默认系统浏览器?
【发布时间】:2013-05-12 08:15:47
【问题描述】:

我正在尝试从 javafx 在默认系统浏览器中打开一个 web url。我没有找到任何有关此的官方文档。有什么线索吗?

编辑: 我找到了a tutorial,但它不起作用。 我正在使用 MacOsX,我尝试启动

java.awt.Desktop.getDesktop().browse(new URI(url));

但我收到了HeadlessExcelption

【问题讨论】:

    标签: javafx javafx-2


    【解决方案1】:

    似乎无法完成,因为此功能未实现:https://javafx-jira.kenai.com/browse/RT-210

    问题是您将无法启动任何东西,这需要 awt-stack 和 jfx 在同一个 VM 中。决定 - 是使用单独的 JVM。只需启动一个单独的 VM,并接受通过套接字浏览的命令。

    这是一种方式,另一种方式 - 是从 java 中找到任何其他方式的浏览器调用 - 这不是 javafx-2 特有的任务,而是 java 特有的任务。

    但是开发者已经添加了评论:

    Anthony Petrov 添加了评论 - 2013 年 5 月 17 日 05:09 PM 请注意,FX8 允许 headful AWT 与 FX 在同一 VM 中运行。所以 AWT API 应该可以工作。

    【讨论】:

    • 这太可怕了:|谢谢。我必须将内容加载到应用程序中还是让用户复制粘贴 URL?这是一个 UX 怪物
    • JavaFX 中有 webView =) 您可以直接在应用程序中加载网站。
    【解决方案2】:

    使用hostServices.showDocument(location)

    尝试将以下代码放在应用程序的启动方法中:

    getHostServices().showDocument("http://www.yahoo.com");
    

    【讨论】:

    • 从其他类调用这个方法怎么样?我在不同的fxml controllers classes 有按钮,需要在某些网站上打开默认浏览器,我该怎么办:)?
    • 在大多数情况下,您可以将静态访问器添加到调用 getHostServices()Application 子类。如果您不想使用静态方法并且希望您的 FXML 控制器在多个应用程序中使用(例如,它们是独立于任何应用程序的库控件),那么您需要传递 application instance into the FXML controllers
    • 我收到了java.lang.Exception: No web browser found:/
    【解决方案3】:

    补充 Jewelsea 的答案,如果您不知道如何调用 getHostServices(),请在您的主课程中尝试:

    HostServicesDelegate hostServices = HostServicesFactory.getInstance(this);
    hostServices.showDocument(WEBSITE);
    

    http://docs.oracle.com/javafx/2/api/javafx/application/HostServices.html#showDocument(java.lang.String)

    【讨论】:

    • 请注意,诸如 HostServicesDelegate 之类的类不是公开记录的 JavaFX API 的一部分,并且可能在更高的 Java 版本(例如 Java 9)中不可用。
    【解决方案4】:

    另一种选择是使用ProcessBuilder

    public static void openWebpage(String url) {
        try {
            new ProcessBuilder("x-www-browser", url).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    如果Desktop.getDesktop().browse(uri) 因某种原因挂起而没有任何错误,您可以使用此选项。

    【讨论】:

      【解决方案5】:

      这是一个在场景控制器中运行的脚本,当一个按钮被激活时:

      package sample;
      
      
      import com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory;
      import com.sun.javafx.application.HostServicesDelegate;
      import javafx.application.Application;
      import javafx.event.ActionEvent;
      import javafx.stage.Stage;
      
      public class Controller extends Application {
      
          public void openBrowser(ActionEvent actionEvent) throws Exception {
      
              HostServicesDelegate hostServices = HostServicesFactory.getInstance(this);
              getHostServices().showDocument("http://www.yahoo.com");
      
          }
      
          @Override
          public void start(Stage primaryStage) throws Exception {
      
          }
      }
      

      【讨论】:

        【解决方案6】:

        试试这个:

        try {
            Desktop.getDesktop().browse(new URL("https://google.com").toURI());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-11
        • 2020-07-10
        • 2011-07-01
        • 2012-07-23
        • 2021-09-16
        • 2011-03-20
        相关资源
        最近更新 更多