0

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

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

我的意思是......我想要做的是在主 gui 控制器中是这样的:

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

4

1 回答 1

1

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);
            }
        }
    }
}

为了与从附加 fxml 文件加载的组件进行“交互”,实际上是控制器对附加 fxml 的责任。加载 fxml 文件后,您可以获得对每个控制器的引用:

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

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

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");
    }
});
于 2016-04-06T16:56:29.893 回答