小编典典

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

java

我有一个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)


阅读 371

收藏
2020-11-26

共1个答案

小编典典

发生此错误是因为您试图将a的 相同
实例添加Node到另一个中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()或类似方法中,并循环使用它来获取新实例。

JavaFX并没有为您提供现成的解决方案来制作的深层副本Node。如果您Node是静态创建的,则可以:

  1. 将负责创建它的代码放在单独的方法中,并在每次需要获取窗格的新实例时在整个应用程序中使用它。
  2. 在FXML文件中定义它,并在每次需要新实例时加载它。

如果您Node拥有由用户动态创建或修改的属性或子代,则情况会变得更加糟糕。在这种情况下,您必须检查其元素并自行重新创建它们。

2020-11-26