繁体   English   中英

需要有关getChildrenUnmodifiable的说明

[英]Explanation needed about getChildrenUnmodifiable

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

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

但是,正如@James_D回答所表明的那样,某些Parent子类确实具有getChildren()public版本。 例如, Pane类可以(而StackPanePane的子类)。 如果你所有的孩子继承Pane ,可以取代Parent在与您的代码Pane

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM