我在 JavaFX 中使用 GluonHQ Maps 1.0.3,但在地图上绘制节点时遇到问题。
我有一堂课GridMapController
,它有一个MapView
叫gridMap
. 我还有一门课GridPaintLayer
,它扩展了MapLayer
所有绘画的完成位置。用方法GridPaintLayer
添加到GridMapController
's中。这个类(提到的( ) 可以右键单击,打开一个弹出菜单,我可以在其中选择“创建节点”。这调用了一个在(见下文)中实现的方法。当我单击“创建节点”菜单项时,一切正常,地图上会出现一个点。gridMap
gridMap.addLayer(gridPaintLayer)
GridPaintLayer
addNode(NodeInputModel)
gridMap
MapView
createNodeItemClicked()
GridPaintLayer
在程序的另一部分,我有一个可观察对象,每当添加节点时它会通知其观察者。通知消息在 中处理GridMapController
,然后addNode()
从 中调用方法GridPaintLayer
。但是现在,当我想要GridPaintLayer's
baseMap
计算场景上的点位置时,该方法baseMap.getMapPoint(double lat, double lon)
返回null
,因为 baseMap 的场景是null
. 所以无法绘制节点。即当我想在应用程序的另一部分创建节点时,就会发生这种情况。observable 正确地通知了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 的拆分窗格:
<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 但没有任何效果。