我在处理一些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不是问题。我不知道一些潜在的机制?谢谢。
答案 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
层次结构副本的功能。)