我已经从 AnchorPane 和一些子元素创建了一个舞台(AnchorPane 及其子元素已在 Java Scene Builder 中创建),层次结构如下所示:
舞台和场景当然是在程序初始化时以编程方式创建的。 我还想以编程方式添加 GridPane 作为图像中显示的 ScrollPane 的子项。 在我的程序(特定窗口的 Controller )中,我可以获得对 ScrollPane 的引用:
@FXML
private ScrollPane srcPaneUsers;
(id srcPaneUsers 已通过 Scene Builder 属性窗口的相应字段给出)
但是!!:当我尝试通过 Controller 初始化方法的以下几行以编程方式添加在运行时创建的新 GridPane 时:
public void initialize(URL location, ResourceBundle resources) {
myGridPane = new GridPane();
srcPaneUsers.getChildren().add(myGridPane);
}
我得到一个编译时错误说 “Parent 类型的 getChildren() 方法不可见。” 所以我无法在运行时添加我的 GridPane。 有什么想法吗?
最佳答案
您调用了错误的方法。你需要
srcPaneUsers.setContent(myGridPane);
getChildren()
Parent
中定义的方法是一种 protected 方法。它在 Pane
中被覆盖成为公共(public)方法,因此对于布局 Pane ( GridPane
、 BorderPane
等),您可以直接操作子节点列表。
ScrollPane
的层次结构是 ScrollPane extends Control extends Region extends Parent
, 所以它继承了 protected
getChildren()
方法。这实际上是有道理的:ScrollPane
的子节点像视口(viewport)(剪辑内容的 View )和滚动条之类的东西:你真的不希望用户操纵它们,否则你最终得到的可能不再正确运行。 ScrollPane
实际上只有一个节点是可配置的:ScrollPane
的节点正在提供一个 View :这被称为它的 content
并通过 contentProperty()
访问, getContent()
, 和 setContent()
方法。
其他“类似容器的控件”的工作方式类似。 TabPane
类公开了一个 getTabs()
返回 ObservableList<Tab>
的方法;和 Tab
类又公开了一个 contentProperty()
这样您就可以访问每个单独选项卡的内容。 SplitPane
选项卡显示 getItems()
返回 ObservableList<Node>
的方法对于 Pane 中显示的节点。在 SplitPane
的情况下它的子节点不仅仅是项目:它们包括代表分隔线等的视觉组件。在这两种情况下,getChildren()
method 是一个 protected 方法(继承自 Parent
)。
请注意 Parent
还定义了公共(public) getChildrenUnmodifiable()
方法,它返回子节点列表的不可修改的 View 。您可以使用它来检查任何父级的节点层次结构,但不能修改它。 (但是,出于调试目的,尤其是为了使用 CSS,我建议使用 ScenicView。)
关于methods - JavaFX:ScrollPane 方法 getChildren() 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26365309/