layout.Pane 和 control.Control 之间有什么区别(在 FXML 中)?

What's the difference (in FXML) between layout.Pane and control.Control?

我正在尝试学习如何创建 UI。我目前正在试验的是左侧的主屏幕,用于容纳用户查看的当前信息;和右侧的手风琴,供用户 select 项确定主屏幕中显示的内容。我正在使用 Scene Builder 来帮助我学习。当我将一个 TitledPane(非空)拖到我的 Accordion 中时,它会在其中放置一个 AnchorPane。除非我误解了什么,否则该 TitledPane 中的 select 可用项目列表不允许大于 TitledPane 的当前高度。所以我在手风琴中添加了另一个 TitledPane(空),然后向其添加了一个 ScrollPane(非空)。这再次在 ScrollPane 中添加了一个 AnchorPane。

这是我的 fxml 文档当前的样子(在版本控制、编码和导入之后):

<VBox fx:id="testPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testfxml.FXMLDocumentController">
    <children>
        <MenuBar>
            <menus>
            <Menu text="File">
                <items>
                    <MenuItem fx:id="1" text="1" />
                    <MenuItem fx:id="2" text="2" />
                    <MenuItem fx:id="3" text="3" />
                </items>
            </Menu>
        </menus>
    </MenuBar>
    <SplitPane dividerPositions="0.75" prefHeight="600" prefWidth="800">
        <items>
            <StackPane fx:id="mainscreen" />
            <Accordion fx:id="test">
                <panes>
                    <TitledPane text="Test1">
                        <content>
                            <AnchorPane fx:id="test1" />
                        </content>
                    </TitledPane>
                    <TitledPane text="Test2">
                       <content>
                          <ScrollPane>
                             <content>
                               <AnchorPane/>
                             </content>
                          </ScrollPane>
                       </content>
                    </TitledPane>          
                </panes>
            </Accordion>
        </items>
    </SplitPane>
</children>

当我查看 javafx (https://docs.oracle.com/javase/8/javafx/api) 的 api 时,AnchorPane 显示如下:

Class 锚点面板

java.lang.Object
   javafx.scene.Node
      javafx.scene.Parent
         javafx.scene.layout.Region
            javafx.scene.layout.Pane
               javafx.scene.layout.AnchorPane

当 ScrollPane 显示时:

Class 滚动面板

java.lang.Object
   javafx.scene.Node
      javafx.scene.Parent
         javafx.scene.layout.Region
            javafx.scene.control.Control
               javafx.scene.control.ScrollPane

我假设格式很重要,对我来说这意味着继承。我注意到一直到 "javafx.scene.layout.Region" 都是相同的,但在那之后它们就不同了。一个转到 layout.Pane,另一个转到 control.Control。

我已经通读了 api 上的描述,也许是因为我明显缺乏编码经验,这对我来说不太有意义 - 也许我正在尝试使用一个其中有哪些不正确?

有什么区别?是否需要 AnchorPane?

你可以把任何你喜欢的东西作为TitledPane的内容。 SceneBuilder(出于某种原因,它似乎过分喜欢 AnchorPanes)将 AnchorPane 作为默认内容;但是您可以删除它,或者只选择 "TitledPane (empty)" 并添加您自己的内容。例如,您可以删除 AnchorPane(或以空 TitledPane 开头),然后将 ScrollPane 拖到那里。

听起来您确实需要 ListView 作为 TitledPane 的内容。 ListView 已经配备了按需滚动条功能。

为了回答您的实际问题,API 文档确实指出了继承层次结构。

JavaFX(与大多数 UI 库一样)定义了丰富的继承结构。 Parent 是场景图中任何包含其他 Node 的超类。绝大多数 类 子类 Parent 也子类 Region,这代表在布局中占据特定 space 的东西。 (例外情况是 Group,它在布局方面的行为有些不同,而 WebView 可能应该是 Control 的子类,但不是...)。

ControlPane 都是 Region(因此也是 Parent)的子类。 Pane 表示 "container":仅用于容纳其他 Node 并管理其布局的东西。 AnchorPanePane 的子类。 Control,相比之下,代表一个UI "widget"(用户直接与之交互的东西),所以LabelButtonComboBox,等等,都是 Control 的子 类。

有些控件实际上相当复杂,并且包含其他 NodeScrollPane 是一个控件的例子,因为用户可以与它交互(通过它的滚动条);它还包含另一个 Node,称为 "content"。就像您可以使用任何 Node 作为 TitledPane 的内容一样,您可以使用任何节点作为 ScrollPane 的内容。 ScrollPanecontent 是用户通过 ScrollPane 的滚动条查看和移动的节点。同样,您可以使用任何 Node 作为 ScrollPane 的内容; SceneBuilder 只是选择 AnchorPane 作为默认值(除了必须使用某些东西之外没有真正的原因)。