Text.setText() 不更新文本,抛出 NullPointerException

Text.setText() not updating text, throws NullPointerException

我在使用 Text.setText() 方法时遇到了一些问题。它应该将 String 名称设置为它的值。

FXML 代码包含文本:

              <Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1">
                 <font>
                    <Font size="17.0" />
                 </font>
              </Text>

这里是 java 代码的片段:

 @FXML
 Text airlineName;

 private void loadNewWindow(String resource, Button button) throws IOException {
        Stage stage = (Stage) button.getScene().getWindow();
        Parent root = FXMLLoader.load(getClass().getResource(resource));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

 @FXML
 public void viewAirline() throws IOException {
        loadNewWindow("/main/resources/Airline Page.fxml", viewAirline);
        //some code here, involves Object selected
        String name = selected.name;
        airlineName.setText(name); //This is line 67
        airlineName.setFill(Color.RED);
        System.out.println(airlineName.getText());

    }

错误信息:

Caused by: java.lang.reflect.InvocationTargetException
    ...
javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 45 more
Caused by: java.lang.NullPointerException
at main.GUI.Controller.viewAirline(Controller.java:67)

viewAirline 方法未在 java 中使用,但在 FXML 中:

<Button fx:id="viewAirline" mnemonicParsing="false" onAction="#viewAirline" text="View Airline" GridPane.columnIndex="1" />

只要按下按钮(名称相似)viewAirline,它就会被激活。

此 FXML 代码是 viewAirline() 方法(“/main/resources/Airline Page.fxml”)中引用的不同 FXML 代码。 Text 元素在 Airline Page.fxml 中被引用。所有 FXML 文件都使用相同的控制器。

它可能抛出空指针异常,可能是因为您的 selected.name 中的名称属性为空,即未分配任何值。

您没有实例化 airlineName 对象。试试下面的代码:

airlineName = new Text();
airlineName.setText(name);

可能无法识别 airLine 文本标签,因为该标签未关闭 尝试关闭您的文本标签:

<Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1" />

 <Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1"></Text>

如果您使用 fx:controller 属性在 fxml 文件中指定控制器 class,则 FXMLLoader 会在加载期间创建控制器的新实例。这导致 airlineName 成为 null,因为该字段被注入到控制器 class 的 不同实例 。要使用相同的控制器实例,需要在加载fxml文件之前设置控制器,同时去掉fxml文件中的fx:controller属性:

FXMLLoader loader = new FXMLLoader(fxmlURL);
loader.setController(controllerInstance);
Parent root = loader.load();

但是我不建议对多个 fxml 使用相同的控制器。这会导致高度耦合,并且控制器中的更改或一个 fxml 文件可能会破坏其他 fxml 中的某些内容。特别是 initialize 方法需要考虑所有 fxml。

你最好使用不同的控制器并让它们相互通信。您甚至可以针对接口进行编程以避免依赖具体的控制器 class.

使用getController():

调用load()后,您可以获得FXMLLoader创建的控制器实例(存在fx:controller属性)
FXMLLoader loader = new FXMLLoader(fxmlURL);
Parent root = loader.load();
ControllerClass controller = loader.getController();