OpenLayers Tile масштабируется с текстовым масштабированием Windows в приложении JavaFX - PullRequest
2 голосов
/ 19 сентября 2019

У меня проблема с WebView, показывающим карту OpenLayers, которая встроена в приложение JavaFX.

Я на компьютере с Windows 10, и когда я изменяю настройки Windows для размера текста, приложенияи т. д. (в настройках отображения), кроме 100%, карта больше не заполняет своего родителя.

Вот как это выглядит со 100%: Application at a 100% scale, и это когдаЯ масштабирую текст и т.д. до 125%: Application at a 125% scale Код можно найти здесь:

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

public class Starter extends Application {

String html = "<!DOCTYPE html>\n"
              + "<html lang=\"en\">\n"
              + "<head>\n"
              + "    <meta charset=\"UTF-8\">\n"
              + "    <title>Title</title>\n"
              + "</head>\n"
              + "<body style=\"margin:0\">\n"
              + "<div id=\"map\"></div>\n"
              + "</body>\n"
              + "</html>";
String webview = "var map;\n"
                   + "function init(x, y, res)\n"
                   + "{\n"
                   + "    map = new ol.Map({\n"
                   + "            layers: [\n"
                   + "              new ol.layer.Tile({\n"
                   + "                source: new ol.source.OSM()\n"
                   + "              })\n"
                   + "            ],\n"
                   + "            target: 'map',\n"
                   + "            view: new ol.View({\n"
                   + "              center: [x, y],\n"
                   + "              projection: \"EPSG:3857\",\n"
                   + "              resolution: res\n"
                   + "            })\n"
                   + "          });\n"
                   + "}";

public static void main(String... args) {
    Starter.launch(args);
}

public void start(Stage primaryStage) {
    StackPane stackPane = new StackPane();
    Scene scene = new Scene(stackPane);

    WebView webView = new WebView();
    stackPane.getChildren().add(webView);

    setupMap(webView);
    webView.setMinWidth(800);
    webView.setMinHeight(600);

    webView.setVisible(true);

    primaryStage.setScene(scene);
    primaryStage.show();
}

private void setupMap(WebView webView) {
    WebEngine engine = webView.getEngine();

    engine.getLoadWorker().stateProperty().addListener(
      (ov, oldState, newState) -> {
          if (newState == Worker.State.SUCCEEDED) {
              Point2D somewhereInRome = new Point2D(1391089.0996927358, 5146427.764506837);
              engine.executeScript("init(" + somewhereInRome.getX() + "," + somewhereInRome.getY() + "," + 1 + ");");
          }
      });

    engine.loadContent(html);
    engine.executeScript(readResources("/js/ol.js"));
    engine.executeScript(webview);
}

private String readResources(String uri) {
    return new BufferedReader(new InputStreamReader(Starter.class.getResourceAsStream(uri))).lines().collect(Collectors.joining("\n"));
}
}

Как видите, ничего интересного не происходит.Что сбивает с толку, так это то, что элементы управления отображаются в нижней части окна в обоих случаях.

Буду признателен за любые указатели на параметры, которые можно использовать для правильной установки размера плиток.

Это на JavaFX 13 и Java 11. "ol.js" - это OpenLayers версии 5.3.0, загруженная сегодня с https://openlayers.org/download/.

1 Ответ

0 голосов
/ 26 сентября 2019

используйте эту библиотеку

https://www.sothawo.com/projects/mapjfx-demo/


также для карт Google используйте эту библиотеку

http://rterp.github.io/GMapsFX/


:)

...