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