【问题标题】:What is a "Node" in JavaFx/FXML?JavaFx/FXML 中的“节点”是什么?
【发布时间】:2016-02-29 06:12:09
【问题描述】:

JavaFx/FXML 上下文中的“节点”一词是什么意思?如果我搜索这个问题,我发现的只是人们使用这个词来讨论其他事情,但没有任何解释。比如这个问题的答案:How do I open the JavaFX FileChooser from a controller class?:

对于场景中的任何节点(例如,根节点;但任何节点 你已经注入了@FXML 会做),做

chooser.showOpenDialog(node.getScene().getWindow());

节点是什么,我将如何“用@FXML 注入它”?

【问题讨论】:

标签: java javafx nodes fxml


【解决方案1】:

在了解 Node 是什么之前,首先了解 JavaFX 中的 Scene Graph 是什么也很重要。

JavaFX 应用程序由 StageScene 或多个场景组成。阶段是应用程序的顶级容器。另一方面,场景包含应用程序的所有内容(用户界面元素)(如果您的应用程序只有一个“页面”)或应用程序的一个“页面”的内容,并且存在于/在舞台上。 (这里要清楚,我所说的页面是指用户与之交互的内容,例如登录页面。)

The Scene Graph is a graphical illustration of how all the stuff in your scene are laid out. This graph is represented in the form of a tree data structure.

A Node is an item in the scene graph.

我认为这张图片清楚地说明了这一点。

Node 的示例是 Control,它是用户可以操作的任何东西,例如 TextField、Button、TextArea

Photo Credit

【讨论】:

    【解决方案2】:

    Node 是“构成”场景图的图形元素的 abstract 超类。

    一些继承自Node的类示例:

    • TextField
    • AnchorPane
    • Canvas
    • Group
    • VBox
    • Button
    • Label
    • ...

    以这种方式注入带有FXMLLoader id 的Node

    1. 在与 fxml 关联的控制器中创建一个具有适当类型的字段(即可以将要注入的元素分配给的任何类型)。此字段必须可由 FXMLLoader 访问,这意味着它必须是 public 或使用 @FXML 注释进行注释。
    2. 将来自 fxml 命名空间的id 属性(很可能使用前缀fx)添加到应注入的fxml 文件中的元素。该属性的值是控制器中字段的名称。

    示例

    fxml

    ....
    <TextField fx:id="myTextField" ....>
    ....
    

    控制器

    ....
    @FXML
    private TextField myTextField;
    ....
    

    在调用控制器的initialize 方法之前,FXMLLoader 使用此信息将它为该 fxml 元素创建的对象分配给字段。

    可以在此处找到包含注入的完整示例/扩展教程:https://docs.oracle.com/javase/8/javafx/fxml-tutorial/fxml_tutorial_intermediate.htm#JFXMG153

    【讨论】:

      【解决方案3】:

      这是一个古老的问题,但它是抽象的回答。 “什么是节点?”和“为了了解什么是节点,您必须首先了解什么是场景图”。节点是最高级别的抽象类,几乎所有在 GUI 中以图形方式显示的内容都从该类派生而来。它的超类是Object。在 Ojonugwa Ochalifu 显示的图像中,有一个阶段包含一个场景,其中包含多个节点,其中包含其他节点。显示的 GUI 图像引出了一个问题“这是如何创建的?”。

      为了便于理解,这里有 Stage、Scene 和 EventTarget 的 JavaDocs。
      在 javafx doc 阶段https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html

      和场景https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Scene.html

      Stage 和 Scene 都继承了相同的接口,EventTarget 和 Pane,以及 Control 和一长串类。 https://docs.oracle.com/javase/8/javafx/api/javafx/event/EventTarget.html

      我还建议查看您正在使用的类的源代码。它将有助于深入了解从节点继承的类的行为。例如,JavaFX 文档提到显示图像时可能存在错误。确保此错误不会出现在 UI 中需要彻底的测试。其他洞察力,例如如何使用多线程技术访问图形,需要了解类使用的“方式”和“内容”。

      场景图形包含在舞台中,由节点的任何子类组成。某些节点(例如窗格)可能有子节点。孩子仍然是一个节点。子节点包含在一个结构中,该结构可能包含其他节点,这些节点也可能有子节点。因此,图很像多维数组或非二叉树。理解这一点也很重要: 场景图是一个无方向图,这意味着子节点可以访问其父节点;一个孩子只能有一个父母;但可以有无限数量的孩子。 getParent() 方法提供对节点父节点的访问。

      Image of scene-graph

      请注意,图结构本质上是一个多维数组。或者换句话说,一个数组可能包含从 Node 继承的其他项目数组,或者诸如 ImageViews、Buttons 等节点。像 Nodes 这样的数组是 Panes、Canvas 等......它可能包含其他节点。

      在测试自动化和可靠地确保 UI 显示应显示的内容时,了解这一点很重要。

      JavaFX 入门的好书是 Kishori Sharan 的“Learn JavaFX 8”。 https://www.amazon.com/Learn-JavaFX-Building-Experience-Interfaces/dp/148421143X/ref=asc_df_148421143X/?tag=bingshoppinga-20&linkCode=df0&hvadid={creative}&hvpos={adposition}&hvnetw=o&hvrand={random}&hvpone=&hvptwo=&hvqmt=e&hvdev=c&hvdvcmdl={devicemodel}&hvlocint=&hvlocphy=&hvtargid=pla-4584413736126928&psc=1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-24
        • 1970-01-01
        • 2017-12-11
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多