text . settext()未更新文本,抛出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文件都使用相同的控制器。

如果使用fx:controller属性在fxml文件中指定控制器类,则FXMLLoader将在加载期间创建控制器的新实例。这导致airlineNamenull,因为该字段被注入到控制器类的的不同实例中。要使用相同的控制器实例,需要在加载fxml文件之前设置控制器,并从fxml文件中删除fx:controller属性:

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

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

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

您可以在使用getController():

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

它可能会抛出空指针异常,可能是因为你的selected.name中的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>

相关内容

  • 没有找到相关文章

最新更新