Java 关于getChildrenUnmodifiable需要解释
我在JavaFX中修改根目录时遇到问题 一个类加载一个FXML并创建一个场景,但我不能使用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
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);
}
感谢您提供答案之外的代码样本。感谢您提供答案之外的代码样本。