JavaFX节点

时间:2020-01-09 10:36:39  来源:igfitidea点击:

JavaFX的Node类javafx.scene.Node是添加到JavaFX场景图的所有组件的基类(超类)。 JavaFX Node类是抽象的,因此我们仅将Node类的子类添加到场景图。场景图中的所有JavaFX Node实例共享一组由JavaFX Node类定义的公共属性。这些通用属性将在本JavaFX Node教程中介绍。

JavaFX节点基础

每个JavaFX Node(子类)实例只能添加到JavaFX场景图一次。换句话说,每个Node实例只能出现在场景图中的一个位置。如果我们尝试多次将同一Node实例或者Node子类实例添加到场景图,则JavaFX将抛出异常!

JavaFX节点有时可以具有也称为子项的子项。给定的Node实例是否可以具有子项取决于具体的Node子类。名为" Parent"的JavaFX Node的特殊子类用于对可以具有子级的Node实例进行建模。因此,可以具有子级的Node实例通常是Parent类的子级,而不是Node类的直接子级。

JavaFX Stage和JavaFX Scene类不是JavaFX Node类的子类。虽然这两个类用于显示JavaFX场景图,但是只有添加到JavaFX Scene实例的Node实例才被视为JavaFX Scene图的一部分。

将Node实例添加到场景图之后,仅JavaFX Application Thread(管理JavaFX场景图的线程)被允许修改Node实例。

JavaFX节点属性

JavaFX Node类以及Node的所有子类具有以下公共属性:

  • 笛卡尔坐标系
  • 一个边界框,其边界为:布局边界
  • 本地界限
  • 父母的界限
  • layoutX
  • 布局Y
  • 首选身高
  • 首选宽度
  • 最小高度
  • 最小宽度
  • 最大高度
  • 最大宽度
  • 用户数据
  • 项(子节点)

这些属性中的每一个都将在后续部分中介绍。

JavaFX节点坐标系

每个JavaFX节点都有其自己的笛卡尔坐标系。与常规直角坐标系的唯一区别是Y轴是反向的。也就是说,坐标系的原点在坐标系的左上角。随着Y值的增加,该点将从坐标系的顶部向下移动。 Y轴的这种反转在2D图形坐标系中是正常的。

JavaFX节点可能具有负的X和Y坐标。

每个节点都有自己的坐标系。此坐标系用于在父节点内或者在JavaFX Canvas上绘制时将子Node实例放置在父Node中。这意味着,作为另一个节点的子节点的节点既具有自己的坐标系,又具有其父节点的坐标系内的位置(X,Y)。

以下是父节点坐标系的示例,其中子节点位于父节点坐标系中的(25,25)。子节点也有自己的坐标系,其坐标系为(0,0),子节点位于父坐标系中,即父节点坐标系中的(25,25)。

JavaFX节点边界框

JavaFX节点具有边界框。 JavaFX节点的边界框是围绕节点形状的逻辑框。完整的Node以图形方式位于边界框内。换句话说,节点的所有角点和边缘都包含在边界框中,并且除非通过效果,填充或者其他应用于节点的内容添加,否则节点周围没有多余的空间。

实际上,一个节点有3个边界框:

名称描述
layoutBounds节点在其自身坐标空间中的边界-没有应用任何效果,剪辑或者变换。
boundsInLocal节点在其自己的坐标空间中的边界-已应用效果和剪辑,但未进行任何变换。
boundsInParent节点在其父坐标空间中的边界-已应用效果,剪辑和变换。

这些包围盒尺寸中的每一个都可以从具有相同名称的相应属性中读取,这意味着这些属性分别名为" layoutBounds"," boundsInLocal"和" boundsInParent"。

父节点(Parent)使用" boundsInParent"边界框来布局其子节点。父节点需要知道总空间,包括节点的所有效果,剪辑和变换,以便能够为其分配空间。

layoutX和layoutY

JavaFX Node对象的layoutXlayoutY属性在其父级内部包含Node的X和Y。换句话说,layoutX和layoutY是相对于父节点的0,0(origo)的偏移量。

并非所有的布局类都将遵循Node的layoutX和layoutY。这取决于父节点的确切布局算法。

node.setLayoutX(100);
node.setLayoutY(200);

首选宽度和高度

JavaFX Node对象的首选宽度和高度属性指定给定Node对象(通常为Node的子类)的首选宽度和高度。并非所有父Node类都将遵守子Node的preferredWidth和preferredHeight。这取决于具体的父节点实现。

node.setPrefWidth(100);
node.setPrefHeight(100);

最小宽度和高度

JavaFX Node对象的最小宽度和高度属性指定节点希望(或者需要)显示自身的最小宽度和高度。并非所有的父Node类都可以遵守这些属性。这取决于具体的父节点实现。

node.setMinWidth(50);
node.setMinHeight(50);

最大宽度和高度

JavaFX Node对象的最大宽度和高度属性指定节点想要(或者需要)显示自身的最大宽度和高度。并非所有的父Node类都可以遵守这些属性。这取决于具体的父节点实现。

node.setMaxWidth(50);
node.setMaxHeight(50);

用户数据

我们可以使用setUserData()方法在JavaFX节点上设置用户数据。此方法采用我们自己选择的任何Java对象。这样,我们可以添加例如JavaFX Node实例创建业务对象。这是将一些用户数据添加到Node实例的示例:

node.setUserData(new MyObject("Hey - some data"));

项目或者子节点

许多JavaFX Node子类可以包含项或者子节点。添加和访问这些子节点的确切方式取决于具体的Node子类。一些类具有一个getItems()方法,该方法返回项目列表。其他类也有一个getChildren()方法。我们将必须检查具体的Node子类,以了解它是否可以具有项目或者子节点,以及如何添加和访问它们。