我在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
将在加载期间创建控制器的新实例。这导致airlineName
是null
,因为该字段被注入到控制器类的的不同实例中。要使用相同的控制器实例,需要在加载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>