Leaflet не работает в WebEngine после JavaFX 17
У меня есть приложение, созданное с помощью JavaFX 16, которое содержит WebView, используемый для отображения интерактивной карты с использованием библиотеки Leaflet JS.
У меня проблема, когда я пытаюсь перейти на JavaFX 17, интерактивная карта больше не работает (ее нельзя перемещать или щелкать, но ее можно прокручивать). Я воспроизвел ошибку на минимальном примере с веб-сайтом OpenStreetMap, который использует Leaflet:
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 (M1 с использованием x86 JavaFX с Rosetta) и на Ubuntu 20. Так что это не похоже на проблему с JavaFX на macOS.
Другие интерактивные карты, такие как карта Google, карта Apple и карта Bing, работали с тем же кодом, что и выше, а MapBoxGL не работает, потому что WebGL не поддерживается. Похоже, проблема связана с Leaflet.
Поэтому мне интересно, является ли это известной проблемой, есть ли у кого-то еще такая же проблема или это проблема на моей стороне?
2 ответа
Я ввел это в базу данных ошибок JDK, потому что здесь, похоже, есть более общая проблема. См.: https://bugs.openjdk.java.net/browse/JDK-8276859 . Это также не единственный отчет о такой проблеме. См. также: После обновления Java до версии 1.8.0_301 JavaFX WebView с Leaflet.Draw.Circle, Leaflet.Edit.Circle не работает, а OSM нельзя перетаскивать
Приятно видеть, что нас стало больше.
Я провел более глубокое исследование и смог точно определить проблему, которая впоследствии привела меня к обходному пути/хаку, благодаря которому перетаскивание карты Leaflet работает нормально в WebKit (JavaFX 17).
Результаты:
Это определенно регресс, поскольку перетаскивание карты Leaflet отлично работает с выпусками JavaFX до 17. Поэтому, как указал @José, это, скорее всего, связано с обновлением WebKit 610.2 (JDK-8259635).
Кажется, это связано с PointerEvent , который, по-видимому, неправильно генерируется в случае JavaFX 17. В следующем примере выводится 1 при перетаскивании с нажатой кнопкой мыши. Но он выводит 0 в случае WebView/WebKit внутри JavaFX 17. Обратите внимание, что
e.buttons
значение правильно установлено равным 1 в версиях JavaFX WebView/WebKit до JavaFX 17.
На основании заключения №. 2 Мне удалось определить код JS, который предотвращает перемещение карты Leaflet (во время перетаскивания). В брошюре 1.7.1. на самом деле это выражение, которое, следовательно, заставляет карту не перемещаться (потому что
PointerEvent.buttons
ошибочно установлен в 0 JavaFX 17):Я уже сообщал об этом через систему отчетов об ошибках Oracle (JDK-8278150). Проблема была «ошибочно» закрыта - я уже предоставил им информацию, объясненную в этом ответе, поэтому они, надеюсь, снова откроют ее или решат ее под JDK-8276859 .
Обходной путь (буклет 1.7.1):
Обходной путь/хак, чтобы карта Leaflet снова работала:
Закомментируйте
if
выражения по адресу:https://github.com/Leaflet/Leaflet/blob/bd88f73e8ddb90eb945a28bc1de9eb07f7386118/src/dom/DomEvent.Pointer.js#L104https://github.com/Leaflet/Leaflet/blob/bd88f73e8ddb90eb945a28bc1de9eb07f7386118/src/dom/DomEvent.Pointer.js#L104 .
Это заставляет карту Leaftlet правильно перемещаться при перетаскивании в JavaFX 17 WebView, но, пожалуйста, считайте это скорее хаком, чтобы заставить его снова работать, поскольку это не было тщательно протестировано...
Обновление 1
Эта проблема, похоже, исчезла с последней основной веткой Leaflet, несмотря на то, что регрессия в JavaFX WebView/WebKit остается (может ли кто-нибудь подтвердить это?).
Обновление 2
Как заявил @mipa, основная проблема была исправлена в 8u291 и openjfx17. Дополнительная информация доступна по адресу:http://bugs.openjdk.java.net/browse/JDK-8278759 .