Java 关于getChildrenUnmodifiable需要解释

Java 关于getChildrenUnmodifiable需要解释,java,javafx,root,Java,Javafx,Root,我在JavaFX中修改根目录时遇到问题 一个类加载一个FXML并创建一个场景,但我不能使用getChildren()函数,只有getChildrenUnmodifiable() login.fxml中的第一个容器是StackPane,可能StackPane不支持它,就像某些控件一样 我可能误解了JavaFX的工作原理 我创建了一个测试应用程序,以查看我的项目的其他类是否导致了该问题: @Override public void start(Stage primaryStage) throws E

我在JavaFX中修改根目录时遇到问题

一个类加载一个FXML并创建一个场景,但我不能使用
getChildren()
函数,只有
getChildrenUnmodifiable()

login.fxml
中的第一个容器是
StackPane
,可能
StackPane
不支持它,就像某些控件一样

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

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

@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
的子类,或者与
Parent
位于同一个包中。这样做显然是为了防止客户端代码能够直接更改子集合

然而,正如@James_D的回答所指出的,
Parent
的子类确实有
public
版本的
getChildren()
。例如,该类确实存在(并且
StackPane
Pane
的子类)。如果您的所有子类都来自
窗格
,您可以用
窗格
替换代码中的
父类
,是一种受保护的
方法;要调用它,您的代码必须是
Parent
的子类,或者与
Parent
位于同一个包中。这样做显然是为了防止客户端代码能够直接更改子集合


然而,正如@James_D的回答所指出的,
Parent
的子类确实有
public
版本的
getChildren()
。例如,该类确实存在(并且
StackPane
Pane
的子类)。如果您的所有子类都来自
窗格
,您可以用
窗格
替换代码中的
父类
Parent.getChildren()
是受保护的
方法。但是,它在
StackPane
中被覆盖(事实上在
窗格中,因此对所有
窗格
子类都是如此),并且可见性扩展到
公共

因此,由于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);
}

正如在另一个答案中指出的,
Parent.getChildren()
是一种受保护的方法。但是,它在
StackPane
中被覆盖(事实上在
窗格中,因此对所有
窗格
子类都是如此),并且可见性扩展到
公共

因此,由于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);
}

感谢您提供答案之外的代码样本。感谢您提供答案之外的代码样本。