2

我正在创建一个简单的天气应用程序

这是我的问题的详细信息:-

我有一个主控制器(GeoWeatherMain.java)。当 Appl 运行时,这个类(GeoWeatherMain.class)被加载,它加载一个 fxml 文件。下面是它的代码:-

Parent root = FXMLLoader.load(getClass().getResource("GeoWeatherMainUI.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();

现在,GeoWeatherMainUI.fxml 具有 BorderPane 对象实现。它由一个按钮(在左侧窗格中)组成,该按钮在单击时会在中心窗格内加载另一个 fxml 文件。GeoWeatherMainUI.fxml 的骨架如下所示:-

<BorderPane fx:id="MainBody" prefHeight="736.0" prefWidth="1140.0" xmlns:fx="http://javafx.com/fxml" fx:controller="geoweather.GeoWeatherUIActionHandlers">
    .
    .
    <Button layoutX="91.0" layoutY="67.0" mnemonicParsing="false" onAction="#getCurrAndForecastWeatherCond" text="Get Weather Details" />
    .
    .
<BorderPane>

现在 GeoWeatherUIActionHandlers.java 是另一个处理不同按钮动作事件的控制器。下面是它的完整代码

public class GeoWeatherUIActionHandlers implements Initializable{
    @FXML
    BorderPane MainBody;
    @FXML
    Label LocName;/*LocName is fx id for a label*/

    @FXML
    private void getCurrAndForecastWeatherCond(ActionEvent event){
        try{
            Pane centerPane = FXMLLoader.load(getClass().getResource("WeatherDetails.fxml"));
            MainBody.setCenter(centerPane);
            /*LocName.setText("xyz");*/
        }catch (IOException ex){
            TextArea excep = new TextArea(ex.toString());
            MainBody.setCenter(excep);
        }catch(Exception e){
            TextArea excep = new TextArea("Inside Exception : \n" + e.toString());
            MainBody.setCenter(excep);
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb){}
}

现在,如果我想用新值更新加载的 WeatherDetails.fxml 文件,该怎么做?我在上面注释的代码中尝试过。(LocName.setText(“xyz”))。但是,它不起作用(给出 NullPointerException)。

我浏览了 javafx @ docs.oracle.com 的完整文档。没运气。在这里我也没有得到答案。请指导。

4

1 回答 1

1

如果 LocName 位于 WeatherDetails.fxml 中,则 LocName 将为空是例外行为。因为@FXML Label LocName;在 GeoWeatherUIActionHandlers.java 中定义,它是 GeoWeatherMainUI.fxml 的控制器。将 LocName 从 WeatherDetails 移动到 GeoWeatherMainUI FXML 文件,看看您仍然在哪里收到错误。

如果您的目标是设置 WeatherDetails.fxml 中的标签文本,请执行此工作

  1. 在类似于当前 GeoWeatherUIActionHandlers 的 WeatherDetails 控制器中,或

  2. 在 GeoWeatherUIActionHandlers 中,加载 WeatherDetails.fxml 后

    • 通过 id(不是 fx:id)从 centerPane 获取标签((Label)centerPane.lookup("#myLabel")).setText("xyz"),或者
    • 获取 WeatherDetails 的控制器并调用 getLocName().setText("xyz")。假设 getter 方法存在于控制器类中。
于 2012-10-03T15:36:50.197 回答