需要有关 getChildrenUnmodifiable 的解释
Explanation needed about getChildrenUnmodifiable
我在 JavaFX 中进行根修改时遇到问题。
A class 加载 FXML 并创建场景,但我无法使用 getChildren()
函数,只有 getChildrenUnmodifiable()
.
login.fxml
中的第一个容器是StackPane
,也许StackPane
不支持它,比如某些控件?
我可能误解了 JavaFX 的工作原理。
我创建了一个测试应用程序来查看是否是我项目的其他 classes 导致了问题:
@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
方法;为了调用它,您的代码必须是 Parent
的子 class 或与 Parent
在同一个包中。这样做显然是为了防止客户端代码能够直接更改 children 集合。
然而,正如@James_D 的回答所指出的,Parent
的子class 确实具有 getChildren()
的 public
版本.例如,Pane class 确实如此(并且 StackPane
是 Pane
的子 class)。如果您的所有 children subclass 来自 Pane
,您可以将代码中的 Parent
替换为 Pane
.
正如另一个答案所指出的,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);
}
我在 JavaFX 中进行根修改时遇到问题。
A class 加载 FXML 并创建场景,但我无法使用 getChildren()
函数,只有 getChildrenUnmodifiable()
.
login.fxml
中的第一个容器是StackPane
,也许StackPane
不支持它,比如某些控件?
我可能误解了 JavaFX 的工作原理。
我创建了一个测试应用程序来查看是否是我项目的其他 classes 导致了问题:
@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
方法;为了调用它,您的代码必须是 Parent
的子 class 或与 Parent
在同一个包中。这样做显然是为了防止客户端代码能够直接更改 children 集合。
然而,正如@James_D 的回答所指出的,Parent
的子class 确实具有 getChildren()
的 public
版本.例如,Pane class 确实如此(并且 StackPane
是 Pane
的子 class)。如果您的所有 children subclass 来自 Pane
,您可以将代码中的 Parent
替换为 Pane
.
正如另一个答案所指出的,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);
}