嵌入 FXML 中的访问操作

Access actions in embed FXML

我的应用程序的结构大致是这样的MainApplication->SuperFXMLController->ChildFXMLController。每个 ChildFXML 都有一个按钮,用于向 SuperFXML 中的 GridPane 添加一个子元素 我已经在 ChildFXMLController 中定义了 buttonHandler 方法,但操作本身应该发生在 SuperFXMLController 中(在网格中添加新行)。问题是如何处理来自 SuperFXMLController 的动作?

这里有一些代码细节: AddLogRecordController.java(所谓"SuperFXMLController"):

@FXML
private void initialize() throws IOException {
rowIndex = 0;

    FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));

    mainGrid.add(loader.load(), 0, rowIndex++);
    RecordGridController controller = (RecordGridController) loader.getController();
    controller.setSuperController(this);
}
...
public void addRowHandle() {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));

        mainGrid.getChildren().add(loader.load());
        RecordGridController controller = loader.getController();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

"RecordGridController" 简称为 "ChildFXMLController":

private AddLogRecordController superController;
...
public void setSuperController(AddLogRecordController addLogRecordControllerClass) {
    this.superController = addLogRecordControllerClass;
}
...
@FXML
private void addRowHandler() {
    superController.addRowHandle();
}

这是结果 window,其中红色包围的部分是子 fxml,应在按下添加到 QSO 按钮时复制多次:

好的,现在我按照计划去做了。我在 SuperController 中添加了以下方法:

private void loadRecordGrid(int rowIndex) {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("RecordGrid.fxml"));

        mainGrid.add(loader.load(), 0, rowIndex);
        RecordGridController controller = (RecordGridController) loader.getController();
        controller.initialize(this);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

然后像这样初始化方法:

@FXML
private void initialize() {
    rowIndex = 0;
    loadRecordGrid(rowIndex++);
}

像这样的 addRowHandler 方法:

public void addRowHandle() {
    loadRecordGrid(rowIndex++);
}

在子控制器中:

private AddLogRecordController superController;

@FXML
public void initialize(AddLogRecordController superController) {
    this.superController = superController;
}


@FXML
private void addRowHandler() {
    superController.addRowHandle();
}

不知道,也许可以用更有效的方法来完成,但目前可行。 现在我需要弄清楚如何将文本字段的值从 child 传递到 parent 并返回