javaFX元素上的空指针

时间:2016-02-17 23:52:23

标签: javafx null

我有以下代码,当我尝试设置我的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>

2 个答案:

答案 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);