JavaFX getChildren()列表行为

时间:2012-11-26 15:21:37

标签: list parent javafx

请查看以下代码:

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中删除。有谁知道为什么这是有意的?

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

1 个答案:

答案 0 :(得分:5)

来自Node documentation

  

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

     

...

     

如果程序将子节点添加到父节点(包括组,区域,   等)并且该节点已经是不同父节点或子节点的子节点   在场景的根,自动(并静默)删除节点   它的前任父母。

     

...

     

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

Node添加到Scene时,JavaFX系统会在场景图中的该位置设置和管理特定于该节点的属性。一个示例是由父布局管理器确定的节点的位置及其约束。另一个是从父节点继承的css样式集。这两种数据都可能因节点在场景图中的位置而异。

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