[英]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类可以(而StackPane
是Pane
的子类)。 如果你所有的孩子继承Pane
,可以取代Parent
在与您的代码Pane
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.