【问题标题】:Leaflet does not work in WebEngine after JavaFX 17JavaFX 17 之后 Leaflet 在 WebEngine 中不起作用
【发布时间】:2021-11-07 12:36:59
【问题描述】:

我有一个使用 JavaFX 16 制作的应用程序,其中包含一个 WebView,用于使用 Leaflet JS 库显示交互式地图。

当我尝试转换到 JavaFX 17 时遇到问题,交互式地图不再起作用(它无法移动或单击,但可以滚动)。我在使用 Leaflet 的 OpenStreetMap 网站的一个最小示例中重现了该错误:

package test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage stage) {
        WebView webView = new WebView();
        webView.getEngine().load("https://www.openstreetmap.org/");
        Scene scene = new Scene(new StackPane(webView), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

OpenStreetMap 网站上的交互式地图渲染正确,可以放大但不能移动。

我正在使用 Gradle 下载 JavaFX,这是我的 build.gradle :

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.10'
}

repositories {
    mavenCentral()
}

javafx {
    version = "17"
    modules = [ 'javafx.controls', 'javafx.web']
}

application {
    mainClass = 'test.App'
}

我用版本重现了这个错误:

  • 18-ea+5
  • 17.0.1
  • 17
  • 17-ea+2

但地图适用于版本:

  • 16
  • 15

看来是版本 17 带来了问题。

我还在 macOS 12(M1 使用 x86 JavaFX 和 Rosetta)和 Ubuntu 20 上重现了该错误。因此,macOS 上的 JavaFX 似乎不是问题。

其他交互式地图,例如 Google 地图、Apple 地图和 Bing 地图,使用与上述相同的代码,并且 MapBoxGL 不工作,因为不支持 WebGL。所以看来这个问题与Leaflet有关。

所以我想知道这是否是一个已知问题,是否其他人也有同样的问题,还是我这边的问题?

【问题讨论】:

  • 坚持为您的应用程序使用 JavaFX 16,因为它可以正常工作。提交 JavaFX 错误(搜索相关说明)。
  • 你可以在这里报告这个问题:bugs.java.com/bugdatabase
  • 我还可以在我的 Mac 上使用 Catalina 10.15.7 确认问题。
  • 与 Java 1.8 中的 @mipa 相同; JavaFX 16 正常。

标签: java javafx leaflet javafx-webengine javafx-17


【解决方案1】:

我已将此输入到 JDK 错误数据库中,因为这里似乎存在更普遍的问题。请参阅:https://bugs.openjdk.java.net/browse/JDK-8276859 这也不是关于此类问题的唯一报告。另见:After Java update to the version 1.8.0_301 JavaFX WebView with Leaflet.Draw.Circle, Leaflet.Edit.Circle does not work as well as OSM is not draggable

【讨论】:

  • 添加了一条评论,由于JDK-8259635 将 WebKit 升级到 610.2,问题开始发生。
【解决方案2】:

很高兴看到我们有更多人对此进行调查。

我进行了一些更深入的调查,并能够查明问题,从而使我找到了一种解决方法/hack,这使得拖动 Leaflet 地图可以在 WebKit (Java FX 17) 中正常工作。

调查结果:

  1. 这绝对是回归,因为在 17 之前的 JavaFX 版本中拖动 Leaflet 地图可以正常工作。所以正如 @José 指出的那样,这很可能与 WebKit 610.2 升级有关 (JDK-8259635)。

  2. 它似乎与PointerEvent 相关,在 Java FX 17 的情况下似乎无法正确生成。以下示例在使用鼠标按钮向下拖动时输出 1。但对于 Java FX 17 中的 WebView/WebKit,它输出 0。请注意,在 Java FX 17 之前的 JavaFX WebView/WebKit 版本中,e.buttons 值正确设置为 1。

<!doctype html>
<body style="height: 200px">
  <p>Click and drag & observe the console output</p>  

  <script>
    var onMove = function (e) {      
      console.log("e.buttons: " + e.buttons);
    }
    
    var body = document.getElementsByTagName('body')[0];
    document.addEventListener("pointermove", onMove, false);
  </script>
</body>
  1. 根据发现没有。 2 我能够识别阻止传单地图移动(在被拖动时)的 JS 代码。在传单 1.7.1 中。实际上是这个 if 表达式导致 map not 被移动(因为 PointerEvent.buttons 被 Java FX 17 错误地设置为 0): https://github.com/Leaflet/Leaflet/blob/bd88f73e8ddb90eb945a28bc1de9eb07f7386118/src/dom/DomEvent.Pointer.js#L104

  2. 我已经通过 Oracle 错误报告系统 (JDK-8278150) 报告了这一点。该问题已“错误地”关闭 - 我已经向他们提供了此答案中解释的信息,因此他们希望重新打开它或在 JDK-8276859 下解决它。

解决方法(传单 1.7.1):

解决方法/破解使 Leaflet 地图再次工作:

在以下位置注释掉if 表达式: https://github.com/Leaflet/Leaflet/blob/bd88f73e8ddb90eb945a28bc1de9eb07f7386118/src/dom/DomEvent.Pointer.js#L104

这使得 Leaftlet 地图在被拖入 Java FX 17 WebView 时可以正确移动 - 但请认为这更像是一种 hack 以使其再次工作,因为这没有经过彻底测试...

更新 1

尽管 JavaFX WebView/WebKit 仍然存在回归问题,但最新的 master branch Leaflet 似乎已经解决了这个问题(谁能确认这一点?)。

更新 2

正如@mipa 所述,基本问题已在 8u291 和 openjfx17 中修复。更多信息请访问: http://bugs.openjdk.java.net/browse/JDK-8278759

【讨论】:

猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2015-06-12
  • 1970-01-01
  • 2015-11-19
相关资源
最近更新 更多