gpt4 book ai didi

java - 使用 GluonHQ map 和 JavaFX 在 MapLayer 上绘制点不起作用

转载 作者:行者123 更新时间:2023-12-02 05:34:11 27 4
gpt4 key购买 nike

我在 JavaFX 中使用 GluonHQ Maps 1.0.3,但在 map 上绘制节点时遇到问题。

我有课GridMapController其中有 MapViewgridMap 。我也有课GridPaintLayer扩展 MapLayer以及所有绘画完成的地方。 GridPaintLayer添加到 GridMapControllergridMap使用方法gridMap.addLayer(gridPaintLayer) 。这个类( GridPaintLayer )有一个方法 addNode(NodeInputModel)我向其传递一个要绘制的节点(包含纬度/经度值)。提到的gridMap ( MapView ) 可以右键单击,打开一个弹出菜单,我可以在其中选择“创建节点”。这调用了一个方法createNodeItemClicked()这是在 GridPaintLayer 中实现的(见下文)。当我单击“创建节点”菜单项时,一切正常, map 上会出现一个点。

在程序的另一部分中,我有一个可观察对象,每当添加节点时它都会通知其观察者。通知消息在 GridMapController 中处理然后调用 addNode()方法来自 GridPaintLayer 。但现在,当我想要GridPaintLayer'sbaseMap要计算场景中的点位置,方法 baseMap.getMapPoint(double lat, double lon)返回null因为baseMap的场景是null 。所以该节点无法被绘制。即当我想在应用程序的另一部分创建一个节点时,就会发生这种情况。可观察到的通知 GridMapController (以及其他)正确,但问题出现如上所述。

以下方法均在 GridPaintLayer 中实现类。

public void addNode(NodeInputModel nodeInputModel) {
Circle circle = new Circle(7, Color.RED);
circle.setCursor(Cursor.HAND);
circle.setVisible(true);

paintedNodes.put(nodeInputModel, circle);

Point2D mapPoint = baseMap.getMapPoint(nodeInputModel.getLat(), nodeInputModel.getLon());
if(mapPoint != null) {
circle.setTranslateX(mapPoint.getX());
circle.setTranslateY(mapPoint.getY());
} else {
System.out.println("Could not calculate node position, baseMap scene = null: " + (baseMap.getScene() == null));
}

AtomicReference<Double> orgSceneX = new AtomicReference<>(0d);
AtomicReference<Double> orgSceneY = new AtomicReference<>(0d);

circle.setOnMousePressed(mousePressedEvent -> {...});

circle.setonMouseClicked(mouseEvent -> {...});

this.getChildren().add(circle);
this.markDirty();
}

public void createNodeItemClicked(MouseEvent mouseEvent) {
// Convert mouseEvent position to geo position
MapPoint mapPoint = baseMap.getMapPosition(mouseEvent.getX(), mouseEvent.getY());
LatLon latLon = new LatLon(mapPoint.getLatitude(), mapPoint.getLongitude());
Point geoPosition = Utils.latlonToPoint(latLon);

// Create NodeInputModel
NodeInputModel nodeInputModel = new NodeInputModel();
nodeInputModel.setGeoPosition(geoPosition);
// TODO: set the other parameters

// Add node to Map
addNode(nodeInputModel);

// Send update message to GridModel
UpdateMessage updateMessage =
new UpdateMessage(null, Arrays.asList(nodeInputModel), UpdateMessage.UpdateType.ADD);
gridMapController.sendUpdateMessage(updateMessage);
}

我尝试了几种方法来“重新激活”场景,但没有任何效果。有没有办法正确地做到这一点?我希望我已经解释清楚了一切。如果没有,请随时询问。

编辑:我正在使用多个 FXML 文件。根 FXML (MainView.fxml):

<VBox   xmlns="http://javafx.com/javafx/8.0.172-ea"
xmlns:fx="http://javafx.com/fxml/1"
fx:id="main"
fx:controller="edu.ie3.controller.main.MainController">

<fx:include fx:id="io" source="IoView.fxml"/>

<fx:include fx:id="tool" source="ToolView.fxml"/>

<HBox prefHeight="${main.height}">
<!-- vertical button bar for grid info -->
<ButtonBar fx:id="leftButtonBar" rotate="-90">
<buttons>
<Button fx:id="gridInfoButton" text="Grid Info"/>
</buttons>
</ButtonBar>

<SplitPane fx:id="splitPane" prefWidth="${main.width}">
<fx:include fx:id="gridTab" source="GridTabView.fxml"/>
</SplitPane>

</HBox>

<fx:define>
<fx:include fx:id="gridInfo" source="GridInfoView.fxml"/>
<fx:include fx:id="gridMap" source="GridMapView.fxml"/>
<fx:include fx:id="gridSchema" source="GridSchemaView.fxml"/>
</fx:define>

</VBox>

包含 GridMapView 的 Splitpane:

<TabPane
xmlns="http://javafx.com/javafx/8.0.172-ea"
xmlns:fx="http://javafx.com/fxml/1"
tabClosingPolicy="UNAVAILABLE"
fx:id="gridTabPane"
fx:controller="edu.ie3.controller.gridTab.GridTabController">

<Tab fx:id="gridMapTab" text="Map View">
<fx:include fx:id="gridMapLayer" source="GridMapView.fxml"/>
</Tab>

<Tab fx:id="gridSchemaTab" text="Schema View">
<fx:include fx:id="gridSchema" source="GridSchemaView.fxml"/>
</Tab>

</TabPane>

GridMapView.fxml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<?import com.gluonhq.maps.MapView?>
<MapView xmlns="http://javafx.com/javafx/8.0.172-ea"
xmlns:fx="http://javafx.com/fxml/1"
fx:id="gridMap"
fx:controller="edu.ie3.controller.gridTab.gridMap.GridMapController">
</MapView>

我已经尝试注释掉一些语句以避免重复包含 GridMapView,但没有任何效果。

最佳答案

我解决了。问题是我在 MainController 中包含一次 GridMapController,在 GridTabController 中包含一次。我从 MainController 中删除了 fx:include ,现在 GridMapController 仅初始化一次。尽管如此,非常感谢你,José Pereda,你让我走上了正确的道路。

关于java - 使用 GluonHQ map 和 JavaFX 在 MapLayer 上绘制点不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56185403/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com