JavaFX - setText() 不工作
JavaFX - setText() is not working
我无法设置文本域的文本。没有错误,但文本字段仍然是空的。
程序的其余部分正在运行,调用该方法并且 System.out.println(...) 打印正确的文本。
所以问题是,无法设置文本字段的文本。即使我只写 textField.setText("0");文本字段仍然是空的。
当我在 public void initialize(...) 下设置文本字段的文本时,它也有效。那么为什么它在 setCurrentInfo 中不起作用?
@FXML
private TextField textField;
private Info currentInfo;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
public void setCurrentInfo(Info currentInfo) {
textField.setText(currentInfo.getpw1());
System.out.println(currentInfo.getpw1());
this.currentInfo = currentInfo;
}
调用setCurrentInfo的控制器部分:
@FXML
private void handleBtn1(ActionEvent event) throws Exception{
Info info = new Info(textFieldA.getText(), textFieldB.getText());
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLPassword.fxml"));
loader.load();
Stage stage;
Parent root;
if(event.getSource()==btn1){
//get reference to the button's stage
stage=(Stage) btn1.getScene().getWindow();
//load up OTHER FXML document
root = FXMLLoader.load(getClass().getResource("FXMLPassword.fxml"));
}
else{
stage=(Stage) btn1.getScene().getWindow();
root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
}
//create a new scene with root and set the stage
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
FXMLPasswordController passwordController = loader.getController();
passwordController.setCurrentInfo(info);
}
您正在从错误的地方检索控制器 FXMLLoader
。特别是,您:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLPassword.fxml"));
loader.load();
之后
FXMLPasswordController passwordController = loader.getController();
在此代码中,您创建了一个 FXMLLoader
并将其指向 FXMLPassword.fxml
文件。但是当你调用 loader.load()
时,它会读取 fxml 文件并创建其中定义的 UI,你对结果什么都不做。因此,调用 loader.load()
创建的 UI 永远不会显示。
因此,当您从 loader
获取控制器并使用它对 UI 进行更改时,您永远不会看到这些更改,因为 TextField
的实例不显示。
显示的 TextField
是在您调用
时创建的
root = FXMLLoader.load(getClass().getResource("FXMLPassword.fxml"));
但是由于你在这里使用了FXMLLoader.load(...)
方法的静态版本,你没有机会获得与之关联的控制器。
您需要重构代码如下:
@FXML
private void handleBtn1(ActionEvent event) throws Exception{
Info info = new Info(textFieldA.getText(), textFieldB.getText());
Stage stage;
Parent root;
if(event.getSource()==btn1){
//get reference to the button's stage
stage=(Stage) btn1.getScene().getWindow();
//load up OTHER FXML document
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLPassword.fxml"));
root = loader.load();
FXMLPasswordController passwordController = loader.getController();
passwordController.setCurrentInfo(info);
}
else{
stage=(Stage) btn1.getScene().getWindow();
root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
}
//create a new scene with root and set the stage
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
我无法设置文本域的文本。没有错误,但文本字段仍然是空的。 程序的其余部分正在运行,调用该方法并且 System.out.println(...) 打印正确的文本。 所以问题是,无法设置文本字段的文本。即使我只写 textField.setText("0");文本字段仍然是空的。 当我在 public void initialize(...) 下设置文本字段的文本时,它也有效。那么为什么它在 setCurrentInfo 中不起作用?
@FXML
private TextField textField;
private Info currentInfo;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
public void setCurrentInfo(Info currentInfo) {
textField.setText(currentInfo.getpw1());
System.out.println(currentInfo.getpw1());
this.currentInfo = currentInfo;
}
调用setCurrentInfo的控制器部分:
@FXML
private void handleBtn1(ActionEvent event) throws Exception{
Info info = new Info(textFieldA.getText(), textFieldB.getText());
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLPassword.fxml"));
loader.load();
Stage stage;
Parent root;
if(event.getSource()==btn1){
//get reference to the button's stage
stage=(Stage) btn1.getScene().getWindow();
//load up OTHER FXML document
root = FXMLLoader.load(getClass().getResource("FXMLPassword.fxml"));
}
else{
stage=(Stage) btn1.getScene().getWindow();
root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
}
//create a new scene with root and set the stage
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
FXMLPasswordController passwordController = loader.getController();
passwordController.setCurrentInfo(info);
}
您正在从错误的地方检索控制器 FXMLLoader
。特别是,您:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLPassword.fxml"));
loader.load();
之后
FXMLPasswordController passwordController = loader.getController();
在此代码中,您创建了一个 FXMLLoader
并将其指向 FXMLPassword.fxml
文件。但是当你调用 loader.load()
时,它会读取 fxml 文件并创建其中定义的 UI,你对结果什么都不做。因此,调用 loader.load()
创建的 UI 永远不会显示。
因此,当您从 loader
获取控制器并使用它对 UI 进行更改时,您永远不会看到这些更改,因为 TextField
的实例不显示。
显示的 TextField
是在您调用
root = FXMLLoader.load(getClass().getResource("FXMLPassword.fxml"));
但是由于你在这里使用了FXMLLoader.load(...)
方法的静态版本,你没有机会获得与之关联的控制器。
您需要重构代码如下:
@FXML
private void handleBtn1(ActionEvent event) throws Exception{
Info info = new Info(textFieldA.getText(), textFieldB.getText());
Stage stage;
Parent root;
if(event.getSource()==btn1){
//get reference to the button's stage
stage=(Stage) btn1.getScene().getWindow();
//load up OTHER FXML document
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLPassword.fxml"));
root = loader.load();
FXMLPasswordController passwordController = loader.getController();
passwordController.setCurrentInfo(info);
}
else{
stage=(Stage) btn1.getScene().getWindow();
root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
}
//create a new scene with root and set the stage
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}