我有一个prefHeight = 70 //没有prefWidth或任何宽度的HBox …
我也有一个prefWidth = 50 //没有prefHeight或任何高度的窗格…
我只想使用某些循环将窗格的多个实例添加到HBox。
当我在循环主体中添加(pane)时,出现以下错误。
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = HBox[id=myHBox]
我需要找到克隆窗格的方法(因为它按值传递)。有人可以帮我吗?(对我来说,拍摄快照不起作用,因为未使用父级设置/计算窗格的prefHeight)
发生此错误是因为您试图将a的 相同 实例添加Node到另一个中Node。如果您从下面的示例中删除评论,您也会收到该错误。另一方面,循环会正常工作,因为在每次迭代中Button都会创建一个新实例。
Node
Button
@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(); }
您的窗格可能更复杂,但是您必须使用相同的原理。将负责创建窗格的代码放在单独的方法getPane()或类似方法中,并循环使用它来获取新实例。
getPane()
JavaFX并没有为您提供现成的解决方案来制作的深层副本Node。如果您Node是静态创建的,则可以:
如果您Node拥有由用户动态创建或修改的属性或子代,则情况会变得更加糟糕。在这种情况下,您必须检查其元素并自行重新创建它们。