如何在JavaFX中克隆场景图中的节点?

如何在JavaFX中克隆场景图中的节点?,java,javafx,clone,pass-by-value,Java,Javafx,Clone,Pass By Value,我有一个prefHeight=70//没有prefWidth或任何宽度的HBox 我还有一个prefWidth=50//无prefHeight或任何高度的窗格 我只想使用一些循环将窗格的多个实例添加到HBox 当我在循环体中添加(窗格)时,它会给出以下错误 Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: p

我有一个prefHeight=70//没有prefWidth或任何宽度的HBox

我还有一个prefWidth=50//无prefHeight或任何高度的窗格

我只想使用一些循环将窗格的多个实例添加到HBox

当我在循环体中添加(窗格)时,它会给出以下错误

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = HBox[id=myHBox]
我需要找到克隆窗格的方法(当它通过值时)。 有人能帮我吗?
(拍摄快照对我不起作用,因为没有使用父节点设置/计算窗格的prefHeight)

发生此错误是因为您试图将一个
节点的同一实例添加到另一个
节点。如果从下面的示例中删除注释,也会出现该错误。另一方面,循环可以正常工作,因为在每次迭代中都会创建新的
按钮
实例

@Override
public void start(Stage stage) {
    FlowPane root = new FlowPane();

    // Results in error
    // Button b1 = new Button("Button");
    // root.getChildren().addAll(b1,b1);

    for (int i = 0; i < 4; i++) {
        Button b = new Button("Button");
        root.getChildren().add(b);
    }

    Scene scene = new Scene(root, 50, 100);

    stage.setScene(scene);
    stage.show();
}
@覆盖
公众假期开始(阶段){
FlowPane根=新的FlowPane();
//导致错误
//按钮b1=新按钮(“按钮”);
//root.getChildren().addAll(b1,b1);
对于(int i=0;i<4;i++){
按钮b=新按钮(“按钮”);
root.getChildren().add(b);
}
场景=新场景(根,50,100);
舞台场景;
stage.show();
}
您的窗格可能更复杂,但必须使用相同的原则。将负责创建窗格的代码放在一个单独的方法中,
getPane()
或类似的方法,并在循环中使用它来获取新实例

JavaFX没有提供现成的解决方案来制作
节点的深度副本。如果您的
节点是静态装箱的,您可以:

  • 将负责创建它的代码放在一个单独的方法中,然后 每次需要获得新的应用程序时,都要在应用程序中使用它 窗格的实例
  • 在FXML文件中定义它,并在每次需要新实例时加载它

  • 如果您的
    节点
    具有由用户动态创建或修改的属性或子级,情况会变得更糟。在这种情况下,您必须检查其元素并自己重新创建它们。

    这很好。但是要添加的我的子节点不能被实例化为那样简单的[(在您的ans:new Button(“Button”)]。我的子节点是经过一个漫长的过程创建的。如果我使用您的方法,我肯定会面临性能问题。无论如何,我感谢您的关注。谢谢!我已经更新了我的答案。简言之,JavaFX(或一般的Java)没有给你一个简单的方法来制作复杂对象的深度副本。谢谢,我能有时间接受你的ans吗?因为我还在工作。当然,也许其他人会想出一个聪明的解决方案。