gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:26:27 26 4
gpt4 key购买 nike

我在使用 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() 方法中引用的不同 FXML 代码(“/main/resources/Airline Page.fxml”)。 Text 元素在 Airline Page.fxml 中引用。所有 FXML 文件都使用相同的 Controller 。

最佳答案

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

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

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

你最好使用不同的 Controller 并让它们进行通信。您甚至可以针对接口(interface)进行编程,以避免依赖具体的 Controller 类。

使用 getController 调用 load() 后,您可以获取由 FXMLLoader 创建的 Controller 实例(存在 fx:controller 属性) ():

FXMLLoader loader = new FXMLLoader(fxmlURL);
Parent root = loader.load();
ControllerClass controller = loader.getController();

关于java - Text.setText() 不更新文本,抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com