0

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

我有一堂课GridMapController,它有一个MapViewgridMap. 我还有一门课GridPaintLayer,它扩展了MapLayer所有绘画的完成位置。用方法GridPaintLayer添加到GridMapController's中。这个类(提到的( ) 可以右键单击,打开一个弹出菜单,我可以在其中选择“创建节点”。这调用了一个在(见下文)中实现的方法。当我单击“创建节点”菜单项时,一切正常,地图上会出现一个点。gridMapgridMap.addLayer(gridPaintLayer)GridPaintLayeraddNode(NodeInputModel)gridMapMapViewcreateNodeItemClicked()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 但没有任何效果。

4

1 回答 1

0

我解决了。问题是我在 MainController 和 GridTabController 中包含了一次 GridMapController。我fx:include从 MainController 中删除了,现在 GridMapController 只初始化一次。尽管如此,还是非常感谢你,何塞佩雷达,你让我走上了正确的道路。

于 2019-05-19T13:32:17.953 回答