У меня проблема с WebView, показывающим карту OpenLayers, которая встроена в приложение JavaFX.
Я на компьютере с Windows 10, и когда я изменяю настройки Windows для размера текста, приложенияи т. д. (в настройках отображения), кроме 100%, карта больше не заполняет своего родителя.
Вот как это выглядит со 100%: , и это когдаЯ масштабирую текст и т.д. до 125%: Код можно найти здесь:
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/.