JavaFX - setText()方法无效

5

我无法设置TextField的文本。没有错误,但是TextField仍然为空。 程序的其余部分正在工作,方法被调用,并且System.out.println(...)打印正确的文本。 因此问题在于,无法设置textfield的文本。即使我只写textField.setText("0");,textfield仍然为空。 当我在public void initialize(...)下设置textfield的文本时,它也可以工作。那么为什么在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);
    }

你是从哪里调用 setCurrentInfo(...) 的?你能在问题中包含调用它的代码吗? - James_D
来自另一个控制器。但它肯定被另外命名了,否则Println就不会打印正确的文本。 - Nik
你是在调用由FXMLLoader创建的此控制器的实例吗?如果您[编辑]问题并包括调用该方法的代码,包括如何获取对控制器的引用,那么这将真正有助于诊断问题。 - James_D
是的,谢谢。请查看答案。 - James_D
1个回答

4

您正在从错误的 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永远不会显示。
因此,当您从该加载器获取控制器并使用它来更改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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接