JavaFx 在主 gui 中包含多个 gui

JavaFx include multiple gui in the main gui

我在使用 SceneBuilder 及其相关控制器创建的 fxml 文件中有一个主图形用户界面。 在那个主要的 gui 中,我有一个网格窗格,我想在其中为每个单元格放置三个 child(一个标签、一个 TextView 和一个 CheckBox)。 所以我创建了一个额外的 fxml,其中一个 HBox 作为 root 和三个 childs.

现在...我如何通过代码在主 gui 的网格窗格中添加为每个单元格定义的组件并与它们交互?

我的意思是...我想在主 gui 控制器中做类似这样的事情:

for (int i) 对于(int j) gridpane.add("the_composed_view_in_the_other_fxml", i, j)

如果我正确理解你的问题,你会在 "main" 控制器的 initialize 方法中做这样的事情:

public class MainController {

    @FXML
    private GridPane gridpane ;

    public void initialize() throws IOException {
        int numCols = ... ;
        int numRows = ... ;

        for (int rowIndex = 0 ; rowIndex < numRows ; rowIndex++) {
            for (int colIndex = 0 ; colIndex < numCols ; colIndex++) {
                FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/addtional/fxml"));
                gridpane.add(loader.load(), colIndex, rowIndex);
            }
        }
    }
}

对于"interacting"从额外的fxml文件加载的组件,额外的fxml实际上是控制器的责任。加载 fxml 文件后,您可以获得对每个控制器的引用:

gridpane.add(loader.load(), colIndex, rowIndex);
AdditionalController controller = loader.getController();

然后您可以调用您在该控制器中定义的方法 class。您还没有真正提供足够的详细信息来说明您可能想在这里做什么,但是,例如:

public class AdditionalController {

    @FXML
    private CheckBox checkBox ;

    public BooleanProperty selectedProperty() {
        return checkBox.selectedProperty();
    }

    // etc...
}

然后是

gridpane.add(loader.load(), colIndex, rowIndex);
AdditionalController controller = loader.getController();

String s = String.format("Item [%d, %d]", colIndex, rowIndex);
controller.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
    if (isNowSelected) {
        // process selection...
        System.out.println(s + " is selected");
    }
});