【问题标题】:JavaFX Swing Browser Very SlowJavaFX Swing 浏览器非常慢
【发布时间】:2015-05-22 22:46:33
【问题描述】:

我正在尝试调用 JFrame 之类的东西来使用 O-Auth 对用户进行身份验证。我实现了身份验证的所有后台需求,并使用默认浏览调用进行了测试:

Desktop.getDesktop().browse(java.net.URI.create(url));

使用默认浏览器,一切正常。 然后我尝试创建我的 owh webview 以在我的应用程序中调用。环顾四周,我发现了 oracle 实现 Oracle JavaFX+Swing example。 Oracle 实现工作但速度很慢。我在eclipse中复制粘贴代码,在java8下运行类。

当我放弃 Oracle 示例时,我发现了这个: 这更快更干净,但是当我调用 Application.launch(args); 时,我的应用程序挂起。

public class Test extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        StackPane root = new StackPane();

            WebView view = new WebView();
        WebEngine engine = view.getEngine();
        engine.load("http://www.google.com.br/");
        root.getChildren().add(view);

        Scene scene = new Scene(root, 800, 600);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) throws IOException {
        Application.launch(args);

    }
}

如果我可以在另一个线程中调用Application.launch(args); 就足够了。

如何从我的应用程序中调用简单的 webView?

【问题讨论】:

  • 你真的是指“另一个线程”吗?从哪个线程调用它应该没有任何区别。如果你从 Test 类之外调用它,你需要 overloaded form: Application.launch(Test.class, args)
  • 如果应用程序的启动方法返回,我的问题将得到解决。但是在应用程序退出之前,启动方法不会返回。我想从我的 Swing 应用程序中调用 JFXApplication 并且不要阻止 Swing 应用程序。所以我需要一个新线程的调用。
  • 在 Swing 中使用 JavaFX 的过程是使用 JFXPanel 而不是启动 JavaFX 应用程序 - 因此您的 Swing 代码不应该调用 JavaFX 应用程序启动方法。

标签: java swing javafx javafx-8


【解决方案1】:

看起来性能问题是 JavaFX 8u25 和 JavaFX 8u40 的一个已知问题:

根据我的测试,该问题与 WebView 是嵌入在 Swing 中还是作为独立的 JavaFX 应用程序运行无关。行为是,如果 WebView 的宽度低于 800 像素,Oracle 页面将在大约 6 秒内完全加载和呈现,如果 WebView 的宽度超过 800 像素,则将需要 30 多秒才能加载。此外,您尝试与之交互的宽 WebView 仍然缓慢且无响应,使其无法使用。

问题是特定于站点内容的,因为如果您将 http://www.google.com.br/ 加载到大小为 1024x768 的 WebView 中,WebView 是 Swing 包装还是纯 JavaFX 应用程序都没有关系 - 性能看起来相同(完成加载约 2.5 秒)。测试系统是运行 OS X 10.9 和 Java 8u40 的 Retina Mac。

该问题旨在针对 Java 9 进行修复(您可以尝试early access releases here)。对于 Java 9,该问题尚未标记为已解决,因此可能仍在进行中的修复工作。

作为一种解决方法,不要让 WebView 的大小超过 800x600。

我不知道以上是您的确切问题,但可能是。可能看起来纯 JavaFX 应用程序的性能优于基于 Swing 的应用程序,因为纯 JavaFX 应用程序在(可能)不同内容上使用较小的 WebView 窗口。

如果您仍然对需要为您的应用程序加载的实际内容(而不是指向 oracle 或 google 网站的内容)有问题,请提供mcve,它会为您的内容产生问题。

如果您的应用程序是 Swing 应用程序,那么您应该使用 JFXPanel 来嵌入 WebView(如 Oracle SimpleSwingBrowser 示例代码),而不是尝试从 Swing 应用程序中启动 JavaFX 应用程序。如果您的应用程序是 JavaFX 应用程序,则无需多次启动 JavaFX 应用程序(而且 JavaFX 应用程序生命周期规则无论如何都禁止这样做)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多