如何在JavaFX中克隆场景图中的节点?
我有一个prefHeight=70//没有prefWidth或任何宽度的HBox 我还有一个prefWidth=50//无prefHeight或任何高度的窗格 我只想使用一些循环将窗格的多个实例添加到HBox 当我在循环体中添加(窗格)时,它会给出以下错误如何在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
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吗?因为我还在工作。当然,也许其他人会想出一个聪明的解决方案。