使用GluonHQ Map和JavaFX在MapLayer上绘制点不起作用

时间:2019-05-17 11:21:56

标签: java javafx maps gluon gluon-desktop

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

我有一个类GridMapController,它有一个名为MapView的{​​{1}}。 我还有一个gridMap类,扩展了GridPaintLayer并完成了所有绘画工作。使用方法MapLayerGridPaintLayer添加到GridMapController的{​​{1}}中。此类(gridMap)具有方法gridMap.addLayer(gridPaintLayer),我将要绘画的节点(包含经纬度值)传递给该方法。可以右键单击提到的GridPaintLayeraddNode(NodeInputModel)),打开一个弹出菜单,我可以在其中选择“创建节点”。这将调用在gridMap中实现的方法MapView(请参见下文)。当我单击“创建节点”菜单项时,一切正常,并且一个点出现在地图上。

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

下面的方法都在null类中实现。

GridMapController

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

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

GridPaintLayer

包含GridMapView的拆分窗格:

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);
}

GridMapView.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在内的重复,但没有任何效果。

1 个答案:

答案 0 :(得分:0)

我解决了。 问题是我在MainController中一次包含了GridMapController,在GridTabController中一次包含了GridMapController。我从MainController中删除了fx:include,现在GridMapController只初始化了一次。 不过,非常感谢您,何塞·佩雷达(JoséPereda),您以正确的方式带领了我。