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();
我在使用 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();