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).

Результаты:

  1. Это определенно регресс, поскольку перетаскивание карты Leaflet отлично работает с выпусками JavaFX до 17. Поэтому, как указал @José, это, скорее всего, связано с обновлением WebKit 610.2 (JDK-8259635).

  2. Кажется, это связано с PointerEvent , который, по-видимому, неправильно генерируется в случае JavaFX 17. В следующем примере выводится 1 при перетаскивании с нажатой кнопкой мыши. Но он выводит 0 в случае WebView/WebKit внутри JavaFX 17. Обратите внимание, что e.buttonsзначение правильно установлено равным 1 в версиях JavaFX WebView/WebKit до JavaFX 17.

  1. На основании заключения №. 2 Мне удалось определить код JS, который предотвращает перемещение карты Leaflet (во время перетаскивания). В брошюре 1.7.1. на самом деле это выражение, которое, следовательно, заставляет карту не перемещаться (потому что PointerEvent.buttonsошибочно установлен в 0 JavaFX 17):

  2. Я уже сообщал об этом через систему отчетов об ошибках 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 .

Другие вопросы по тегам