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

How to clone a node in the scene graph in JavaFX?

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

我还有一个 pane 的 prefWidth = 50 // 没有 prefHeight 或任何高度...

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

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

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = HBox[id=myHBox]

我需要找到克隆窗格的方法(因为它按值传递)。 有人可以帮我吗? (拍摄快照对我不起作用,因为未使用父级设置/计算窗格的 prefHeight)

发生此错误是因为您试图将 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 没有提供 out-of-the-box 解决方案来制作 Node 的深层副本。如果您的 Node 是静态创建的,您可以:

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

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