需要解释getChildrenUnmodifiable

时间:2015-09-22 21:53:53

标签: java javafx root

我在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()
}

有人可以解释原因吗?

2 个答案:

答案 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类确实(StackPanePane的子类)。如果您的所有子项都是Pane的子类,则可以使用Parent替换代码中的Pane