我有一个简单的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);
}
}
答案 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