我在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()
}
有人可以解释原因吗?
答案 0 :(得分:3)
正如其他答案所指出的那样,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);
}
答案 1 :(得分:1)
Parent.getChildren()是一种protected
方法;为了调用它,您的代码必须是Parent
的子类或与Parent
在同一个包中。这显然是为了防止客户端代码直接更改子集合。
但是,正如@James_D的回答所示,Parent
的子类的public
版本为getChildren()
。例如,Pane类确实(StackPane
是Pane
的子类)。如果您的所有子项都是Pane
的子类,则可以使用Parent
替换代码中的Pane
。