使用 GMapsFX 和 FXML 时如何初始化 Google Maps API 键?

How do I initialize Google Maps API key when using GMapsFX and FXML?

我正在尝试建立一个 JavaFX 我使用 GMapsFX 的项目。我已经让它在不使用 FXML 的情况下工作,我刚刚在 start() 方法中初始化了 GoogleMapView 变量。因此我也假设我的 API 键不是问题所在。但是,在使用 FXML 时,我不确定在哪里初始化它。我得到的只是:"For developer use only" 或空白页。是否可能是因为 FXML 在 FXML 控制器中的 initialize() 方法之前加载?

这是我的控制器:

public class MapSceneController implements Initializable, MapComponentInitializedListener {

    //I have tried to initialize it here
    @FXML
    private GoogleMapView mapView = new GoogleMapView(Locale.getDefault().getLanguage(), "AIzaSyAaCPNXgEw5zlJTHLr0MYOmvxOcQ50vLdw");

    @FXML
    private TextField addressTextField;

    private GoogleMap map;

    private GeocodingService geocodingService;

    private StringProperty address = new SimpleStringProperty();

    @Override
    public void mapInitialized() {
        //And here
        //mapView = new GoogleMapView(Locale.getDefault().getLanguage(), "AIzaSyAaCPNXgEw5zlJTHLr0MYOmvxOcQ50vLdw");
        geocodingService = new GeocodingService();
        MapOptions mapOptions = new MapOptions();

        mapOptions.center(new LatLong(47.6097, -122.3331))
                .mapType(MapTypeIdEnum.ROADMAP)
                .overviewMapControl(false)
                .panControl(false)
                .rotateControl(false)
                .scaleControl(false)
                .streetViewControl(false)
                .zoomControl(false)
                .zoom(12);

        map = mapView.createMap(mapOptions);
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //And here
        //mapView = new GoogleMapView(Locale.getDefault().getLanguage(), "AIzaSyAaCPNXgEw5zlJTHLr0MYOmvxOcQ50vLdw");
        mapView.addMapInitializedListener(this);
        address.bind(addressTextField.textProperty());
    }

    @FXML
    public void addressTextFieldAction(ActionEvent event) {
        geocodingService.geocode(address.get(), (GeocodingResult[] results, GeocoderStatus status) -> {

            LatLong latLong = null;

            if( status == GeocoderStatus.ZERO_RESULTS) {
                Alert alert = new Alert(Alert.AlertType.ERROR, "No matching address found");
                alert.show();
                return;
            } else if( results.length > 1 ) {
                Alert alert = new Alert(Alert.AlertType.WARNING, "Multiple results found, showing the first one.");
                alert.show();
                latLong = new LatLong(results[0].getGeometry().getLocation().getLatitude(), results[0].getGeometry().getLocation().getLongitude());
            } else {
                latLong = new LatLong(results[0].getGeometry().getLocation().getLatitude(), results[0].getGeometry().getLocation().getLongitude());
            }

            map.setCenter(latLong);

        });
    }
}

这是我的 FXML:

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

    <?import com.lynden.gmapsfx.GoogleMapView?>
    <AnchorPane id="AnchorPane" prefHeight="600" prefWidth="1066" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65" fx:controller="sample.JavaFX.MapScene.MapSceneController">
        <children>
            <GoogleMapView fx:id="mapView" prefHeight="600.0" prefWidth="1066.0" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0.0"/>
            <TextField fx:id="addressTextField" onAction="#addressTextFieldAction" prefHeight="27.0" prefWidth="274.0" promptText="Address" AnchorPane.leftAnchor="10" AnchorPane.topAnchor="10" />
        </children>
    </AnchorPane>

提前致谢! :)

您的代码中存在几个问题。我不知道 GMapsFX 的 API 但如果构造函数 GoogleMapView 是设置密钥的唯一方法,那么我会提出以下建议。在您的 FXML 文件中,仅定义要放置地图视图的容器。然后在初始化方法(在 FXML 部分实例化后自动调用)中手动创建地图视图并将其添加到容器中。删除所有其他初始化,因为它们将不起作用。