来自控制器类的TextArea getter给出了NullPointerException

时间:2017-02-24 10:47:28

标签: javafx

我有一个简单的javafx FXML应用程序 它有一个按钮和一个textArea

我正在尝试从另一个写入textArea class(不是控制器)

不发送textArea 那个班,

我在我的控制器类上添加了一个getter, 在writingClass上我创建了一个ControllerClass的对象

然后尝试写入textArea, 我收到了java.lang.NullPointerException和java.lang.reflect.InvocationTargetException

我做错了什么???

//Controller.java

package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;

public class Controller {

    @FXML
    Button myButton;

    @FXML
    TextArea myTextArea;
    WriteToTextArea writeToTextArea;

    public TextArea getMyTextArea() {
        return myTextArea;
    }

    public void buttonPressed() {
        writeToTextArea = new WriteToTextArea();
        writeToTextArea.writeThis("trying To Write To TextArea");
    }
}
//WriteToTextArea.java

package sample;
import javafx.scene.control.TextArea;

public class WriteToTextArea {

    private Controller objectController;
    private TextArea textArea;
    public WriteToTextArea() {
        objectController = new Controller();
        textArea = new TextArea();
        textArea = objectController.getMyTextArea();
    }

    public void writeThis(String whatToWrite) {
        textArea.setText(whatToWrite);
    }
}

1 个答案:

答案 0 :(得分:1)

加载FXML文件时,textArea会在FXMLLoader中初始化Controller。它仅在控制器中初始化,并且不会在同一类的其他实例中初始化(它将被初始化为什么?)。因此,当您使用

创建新的 objectController = new Controller(); 实例时
textArea

该实例中的textArea.setText(whatToWrite); 为空,因此当您调用

WriteToTextArea

你得到一个空指针异常。

您需要WriteToTextArea实例来引用控制器本身,而不是同一类的任意实例。您可以通过将对控制器的引用传递给package sample; import javafx.scene.control.TextArea; public class WriteToTextArea { private Controller objectController; private TextArea textArea; public WriteToTextArea(Controller objectController) { this.objectController = objectController ; textArea = objectController.getMyTextArea(); } public void writeThis(String whatToWrite) { textArea.setText(whatToWrite); } } 构造函数来执行此操作:

public void buttonPressed() {
    writeToTextArea = new WriteToTextArea(this);
    writeToTextArea.writeThis("trying To Write To TextArea");
}

然后在控制器代码中

hardware_concourrency