为什么在JavaFX中某些控件和布局具有“children”属性,而其他具有“items”属性的用户具有相同的目的?是否有任何哲学背后或可能存在技术差异?
答案 0 :(得分:1)
getChildren()
方法在Parent
中定义,因此由Parent
的所有子类继承,包括Pane
和Control
。 Parent
中此方法的实现返回一个不可修改的子节点列表(因此它可用于在场景图中导航,但不能用于操纵父节点中包含的内容) )。
Pane
类及其子类旨在允许您在场景图中布置其他节点。因此Pane
会覆盖getChildren()
以返回这些节点的可修改列表:基本上Pane
的功能是允许您向其添加节点并将其删除以后如果你需要的话。 Pane
子类以各种方式定位这些节点。
Control
类是Parent
的子类,因为控件包含其他节点。 (例如,ComboBox
包含标签或文本字段(如果它可以编辑),以及用于显示下拉列表的按钮。)Control
从{继承getChildren()
方法{1}},因此它返回子节点的不可修改列表,但不允许您更改该列表(因为如果从控件中删除节点,它将不再像控件的设计方式那样运行表现得好。)
某些控件旨在显示其他内容。琐碎的是,Parent
或Label
可以有Button
,这是任何节点。这些类的API允许您更改该节点(通过graphic
)。
更复杂的控件允许您添加和删除节点集合,作为其预期功能的一部分。因此,例如setGraphic()
允许您添加任意数量的节点,并在需要时删除它们。但是,这些不是SplitPane
中包含的仅节点。因此SplitPane
方法仍然从超类中实现它:它返回拆分窗格的所有子节点的不可修改的列表:包括您添加的项目和分隔符(以及可能的其他内容)。另一方面,getChildren()
方法返回允许更改的节点列表:因此您可以通过调用getItems()
来删除项目(并且拆分窗格将从其子项中删除相应的分隔符)列表也是如此)。
其他复杂控件具有可能返回特定类型的splitPane.getItems().remove(...)
方法:例如getItems()
会返回Menu.getItems()
(因此您无法在菜单中添加ObservableList<MenuItem>
,您只能将菜单项放入其中)。同样,TableView
会返回TabPane.getItems()
。
简而言之,这两件事的功能完全不同。 ObservableList<Tab>
返回父节点的子节点列表:它允许您检查和导航场景图。专门选择这样做的getChildren()
子类可能会返回一个可修改的列表,允许您将它们用作通用容器。
某些Parent
类定义的getItems()
方法用于定义该特定控件的特定功能。他们仍然使用Control
方法,这将返回不同的列表。