JavaFX17之后,传单在WebEngine中不起作用



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

当我尝试转换到JavaFX17时,我遇到了一个问题,交互式地图不再工作(它不能移动或单击,但可以滚动(。我在使用传单的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,这是我的构建。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(M1使用带有Rosetta的x86 JavaFX(和Ubuntu 20上复制了这个错误。因此,这似乎不是macOS上JavaFX的问题。

其他交互式地图,如谷歌地图、苹果地图和必应地图,使用的代码与上述相同,MapBoxGL不起作用,因为不支持WebGL。因此,这个问题似乎与传单有关。

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

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

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

我做了一些更深入的调查,并能够找出问题所在,因此我找到了一个变通方法/破解方法,使在WebKit(Java FX 17(中拖动传单地图可以很好地工作。

调查结果:

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

  2. 它似乎与PointerEvent有关,在Java FX 17的情况下,PointerEvent似乎没有正确生成。以下示例在按住鼠标按钮拖动时输出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表达式导致映射到而不是被移动(因为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中拖动时能够正确移动,但请将其视为一次黑客攻击,以使其再次工作,因为这还没有彻底测试。。。

更新1

尽管JavaFX WebView/WebKit中的回归仍然存在,但传单的最新主分支似乎已经解决了这个问题(有人能证实吗?(。

更新2

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

相关内容

  • 没有找到相关文章

最新更新