我有以下代码,当我尝试设置我的fxml的textArea的文本时,我得到一个空指针异常。窗口显示为应该显示,但控制器无法识别其中的元素。
声明:
public TextArea txtArea;
这是控制器方法体:
Stage stage = new Stage();
FXMLLoader loader = new FXMLLoader();
AnchorPane page = loader.load(getClass().getResource("demo.fxml"));
loader.setController(this);
Scene scene = new Scene(page);
stage.setScene(scene);
stage.initOwner(primaryStage);
stage.initModality(Modality.WINDOW_MODAL);
stage.show();
txtArea.setText("something"); //this is where it crashes -> null pointer
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity"
minHeight="-Infinity" minWidth="-Infinity" prefHeight="160.0" prefWidth="353.0"
xmlns="http://javafx.com/javafx/2.2">
<children>
<BorderPane prefHeight="-1.0" prefWidth="-1.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<center>
<TextArea fx:id="txtArea" editable="false" focusTraversable="false" prefWidth="200.0" wrapText="true" />
</center>
</BorderPane>
</children>
</AnchorPane>
答案 0 :(得分:1)
您的代码中有两个错误。首先,你正在打电话
loader.setController(this);
之后你打电话
loader.load();
这意味着加载FXML文件时FXMLLoader
上没有设置控制器,因此无法初始化控制器字段。切换通话顺序。
其次,您使用的是静态 FXMLLoader.load(URL)
方法。由于这是一种静态方法,因此它不知道您创建的FXMLLoader
的状态,包括控制器。您需要设置位置,并使用没有参数的实例方法FXMLLoader.load()
。
FXMLLoader loader = new FXMLLoader(getClass().getResource("demo.fxml"));
loader.setController(this);
AnchorPane page = loader.load();
Scene scene = new Scene(page);
我还强烈建议您制作所有字段private
,而不是public
。使用@FXML
注释字段以允许注入:
@FXML
private TextArea txtArea ;
答案 1 :(得分:0)
我不确定为什么会有效,但有人可能会解释原因。我刚刚使用.fxml文件初始化FXMLLoader而不是创建加载器并将load方法传递给资源。即。
FXMLLoader loader = new FXMLLoader(getClass().getResource("demo.fxml"));
loader.setController(this);
AnchorPane page = loader.load();
Scene scene = new Scene(page);