需要有关 getChildrenUnmodifiable 的解释

Explanation needed about getChildrenUnmodifiable

我在 JavaFX 中进行根修改时遇到问题。

A class 加载 FXML 并创建场景,但我无法使用 getChildren() 函数,只有 getChildrenUnmodifiable().

login.fxml中的第一个容器是StackPane,也许StackPane不支持它,比如某些控件?

我可能误解了 JavaFX 的工作原理。

我创建了一个测试应用程序来查看是否是我项目的其他 classes 导致了问题:

@Override
public void start(Stage primaryStage) throws Exception {
    Parent rootScene = FXMLLoader.load(getClass().getResource("login.fxml"));
    Scene scene = new Scene(rootScene, 900, 500);
    //rootScene.getChildrenUnmodifiable()
}

谁能解释为什么?

Parent.getChildren() 是一个 protected 方法;为了调用它,您的代码必须是 Parent 的子 class 或与 Parent 在同一个包中。这样做显然是为了防止客户端代码能够直接更改 children 集合。

然而,正如@James_D 的回答所指出的,Parent 的子class 确实具有 getChildren()public 版本.例如,Pane class 确实如此(并且 StackPanePane 的子 class)。如果您的所有 children subclass 来自 Pane,您可以将代码中的 Parent 替换为 Pane.

正如另一个答案所指出的,Parent.getChildren() 是一种 protected 方法。但是,它在 StackPane 中被覆盖(实际上在 Pane 中,因此对于所有 Pane 子类都是如此)并且可见性扩大到 public.

因此,由于您的 FXML 的根实际上是一个 StackPane,您所要做的就是更改 root 的编译时类型:

@Override
public void start(Stage primaryStage) throws Exception {
    StackPane rootScene = FXMLLoader.load(getClass().getResource("login.fxml"));
    rootScene.getChildren().add(...);
    Scene scene = new Scene(rootScene, 900, 500);
}