如何在JavaFX中从另一个FXML的另一个控制器设置文本JFXTextField

如何在JavaFX中从另一个FXML的另一个控制器设置文本JFXTextField,java,javafx,Java,Javafx,我试图通过单击另一个FXML Tableview中的一行来为FXML中的JFXTextField设置文本值,但是,这就是我所尝试的 控制器1 控制器2 在我运行程序后,文本字段没有更新,我想知道为什么?这个问题有什么可能的解决办法吗?谢谢大家! 您可以使用静态变量解决此问题,请尝试以下操作: 控制器1: public static JFXTextField txtKelasStatic; @Override public void initialize(URL location, Resour

我试图通过单击另一个FXML Tableview中的一行来为FXML中的JFXTextField设置文本值,但是,这就是我所尝试的

控制器1

控制器2


在我运行程序后,文本字段没有更新,我想知道为什么?这个问题有什么可能的解决办法吗?谢谢大家!

您可以使用静态变量解决此问题,请尝试以下操作:

控制器1:

public static JFXTextField txtKelasStatic;

@Override
public void initialize(URL location, ResourceBundle resources) {
    txtKelasStatic = txtKelas;
}
@FXML
void clickItem(MouseEvent event) {
    if (event.getClickCount() == 1 || event.getClickCount() == 2) {
        if (tableView.getSelectionModel().getSelectedItem() == null) {
            System.out.println("Null");
        } else if(tableView.getSelectionModel().getSelectedItem() != null){
            int index = tableView.getSelectionModel().getSelectedIndex();

            Kereta_Controller.txtKelasStatic.setText(tableView.getColumns().get(0).getCellObservableValue(index).getValue().toString());

            Stage stage = (Stage) tableView.getScene().getWindow();
            stage.close();
        }
    }
}
PS:您需要在
控制器1
中实现该接口

控制器2:

public static JFXTextField txtKelasStatic;

@Override
public void initialize(URL location, ResourceBundle resources) {
    txtKelasStatic = txtKelas;
}
@FXML
void clickItem(MouseEvent event) {
    if (event.getClickCount() == 1 || event.getClickCount() == 2) {
        if (tableView.getSelectionModel().getSelectedItem() == null) {
            System.out.println("Null");
        } else if(tableView.getSelectionModel().getSelectedItem() != null){
            int index = tableView.getSelectionModel().getSelectedIndex();

            Kereta_Controller.txtKelasStatic.setText(tableView.getColumns().get(0).getCellObservableValue(index).getValue().toString());

            Stage stage = (Stage) tableView.getScene().getWindow();
            stage.close();
        }
    }
}

您正在更新的文本字段不会显示在任何地方(您只需调用
loader.load()
并放弃结果),因此不会看到任何效果。考虑使用MVC方法,而不是直接将控制器相互链接。James_D我想还有很多事情需要用这个程序来解决,考虑到它仍然很混乱,谢谢你的建议,在可能的情况下检查它,(错误地)使用静态范围来传递参数是最糟糕的options@kleopatra我能知道为什么这不是一个好的选择吗?@AmarWibi99 1<代码>静态范围在这里是错误的:文本字段是加载的UI的特定副本的属性,而不是类的属性。如果您后来决定加载FXML并在应用程序中显示两个或多个副本,这将完全中断。因为这似乎是一个表项的“详细信息窗格”,所以您以后可能会决定为多个选定项显示多个详细信息窗格。@AmarWibi99 2。它破坏了封装。UI控件应视为FXML控制器对的实现细节,不应公开。如果您后来决定(例如)用组合框替换文本字段(或者停止使用JFoenix),则必须遍历所有代码以查看需要更改的内容。UI控件不应公开(直接通过字段或通过方法)。虽然我建议的解决方案可行,但我同意您的看法,如果您想创建多个UI实例,它可能会导致其他问题。