父节点丢失其子节点

时间:2016-05-30 11:45:22

标签: javafx parent-child

我在处理一些java fx组件时发现了一些奇怪的行为。我想在GUI上按下按钮后,通过控制器动态地将子节点添加到父节点。这是一个可重现的问题场景:

    VBox vbox = new VBox();
    HBox entry = new HBox();
    Button button = new Button();
    TextField text = new TextField();

    entry.getChildren().add(text);
    entry.getChildren().add(button);

    vbox.getChildren().add(entry);

    System.out.println(vbox.getChildren().isEmpty() ? "empty" : "not empty"); //prints out "not empty"
    HBox newEntry = new HBox(entry);
    System.out.println(vbox.getChildren().isEmpty() ? "empty" : "not empty"); //prints out "empty"

当我将vbox传递给构造函数时,你能否告诉我为什么entry在孩提时失去entry?我将entry传递给构造函数,以便复制已经通过FXML表单设置的所有其他对象属性/属性。在我的实际代码中,每个元素都有一个不同的标识符,通过node.setId()方法设置,因此重复的ID不是问题。我不知道一些潜在的机制?谢谢。

1 个答案:

答案 0 :(得分:3)

  

我将entry传递给构造函数,以便复制已经通过FXML表单设置的所有其他对象属性/属性。

这种方式不起作用。该构造函数添加与新创建的HBox的子实例相同的实例。由于Node只能有一个父项,并且Node的子项列表中出现Parent,因此JavaFX必须通过从子项中删除Node来修复状态它的前父母名单。

请注意,相当多的Pane允许您将子项传递给其中一个构造函数。那些不是复制构造函数,但只是“快捷方式”允许您在不使用pane.getChildren().addAll(children);的情况下添加子项实际上我不知道Node的任何复制构造函数在JavaFX API中。

HBox newEntry = new HBox(entry);

创建一个新的HBox,其中包含entry,因为它是唯一的孩子。

不是试图复制场景图的一部分,而是创建一个辅助方法来创建场景图的一部分(也可以使用fxml文件完成),这通常更容易。

(JavaFX API中没有允许您创建Node层次结构副本的功能。)