JavaFX - setText()不起作用

时间:2016-01-17 01:46:39

标签: java javafx fxml

我无法设置Textfield的文本。没有错误,但Textfield仍为空。 程序的其余部分正在运行,调用该方法并且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);
    }

1 个答案:

答案 0 :(得分: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。

因此,当您从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();
}