2

看下面的代码:

public static void main(String[] args) {
        Group group1 = new Group();
        Group group2 = new Group();

        Label label = new Label("test");

        group1.getChildren().add(label);
        group2.getChildren().add(label);

        System.out.println("Size group1: " +group1.getChildren().size());
        System.out.println("Size group2: " +group2.getChildren().size());
    }

如果标签被添加到 group2,它会自动从 group1 中删除。有谁知道这是为什么?

到目前为止,我不需要额外的功能,例如来自组类的边界,而是使用简单的 ArrayList 来存储对标签对象的引用。

4

1 回答 1

5

Node文档中:

一个节点在场景图中的任何地方最多可能出现一次。具体来说,一个节点必须在以下所有情况中出现不超过一次:作为场景的根节点、父节点的子 ObservableList 或节点的剪辑。

...

如果程序将子节点添加到父节点(包括组、区域等)并且该节点已经是不同父节点的子节点或场景的根节点,则该节点会自动(并且无声地)从其前父节点中删除。

...

可以重新排列场景图的结构,例如,将子树从场景图中的一个位置移动到另一个位置。为了做到这一点,通常会在将子树插入新位置之前从其旧位置删除子树。但是,如果应用程序没有显式删除子树,则会如上所述自动删除子树。

当 aNode添加到 aScene时,JavaFX 系统会在场景图中的该位置设置和管理特定于该节点的属性。一个示例是由父布局管理器确定的节点位置及其约束。另一种是继承自父节点的css样式集。这两种类型的数据可能会根据节点在场景图中的位置而有所不同。

如果系统允许您将同一节点也放置在场景图中的另一个位置,它将覆盖为第一个位置确定的系统计算属性。一切都会变得非常混乱 - 导致程序难以推理并拥有微妙的错误。

于 2012-11-26T19:32:58.370 回答