【问题标题】:JavaFX - setText() is not workingJavaFX - setText() 不工作
【发布时间】:2016-01-17 01:46:38
【问题描述】:

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

【问题讨论】:

  • 你从哪里打电话给setCurrentInfo(...)?您可以在问题中包含您调用它的代码吗?
  • 来自另一个控制器。但它肯定被称为否则 Println 不会打印正确的文本。
  • 你是在FXMLLoader创建的这个控制器的实例上调用它吗?如果您将edit 问题并包含调用该方法的代码,包括您如何获取对控制器的引用,这将真正有助于诊断问题。
  • 好的,谢谢。见答案。

标签: java javafx fxml


【解决方案1】:

您从错误的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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多