7

我有一个使用 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个+2

但地图适用于版本:

  • 16
  • 15

所以似乎版本 17 带来了这个问题。

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

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

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

4

2 回答 2

3

我已将此输入到 JDK 错误数据库中,因为这里似乎存在更普遍的问题。请参阅:https ://bugs.openjdk.java.net/browse/JDK-8276859 这也不是关于此类问题的唯一报告。另请参阅:使用 Leaflet.Draw.Circle 将 Java 更新到版本 1.8.0_301 JavaFX WebView 后,Leaflet.Edit.Circle 无法正常工作,因为 OSM 不可拖动

于 2021-11-09T14:08:04.160 回答
3

很高兴看到我们中有更多人正在研究这个问题。

我做了一些更深入的调查,并能够查明问题,从而导致我找到一个解决方法/黑客,这使得拖动 Leaflet 地图在 WebKit (Java FX 17) 中工作正常。

发现:

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

  2. 它似乎与在 Java FX 17 的情况下似乎无法正确生成的PointerEvent相关。以下示例在使用鼠标按钮向下拖动时输出 1。但在 Java FX 17 中的 WebView/WebKit 的情况下,它输出 0。请注意,e.buttons在 Java FX 17 之前的 JavaFX WebView/WebKit 版本中,该值已正确设置为 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表达式导致地图被移动(因为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):

使传单地图再次工作的解决方法/黑客:

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

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

更新 1

尽管 JavaFX WebView/WebKit 的回归仍然存在,但 Leaflet的最新主分支似乎已经解决了这个问题(任何人都可以确认这一点吗?)。

更新 2

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

于 2021-12-10T06:42:36.413 回答