如何在 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
是静态创建的,您可以:
- 将负责创建它的代码放在一个单独的方法中,然后
每次需要获得新的时,在整个应用程序中使用它
您的窗格的实例。
- 在 FXML 文件中定义它,并在每次需要新实例时加载它。
如果您的 Node
具有由用户动态创建或修改的属性或子项,情况会变得更糟。在这种情况下,您必须检查其元素并自行重新创建它们。
我有一个 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
是静态创建的,您可以:
- 将负责创建它的代码放在一个单独的方法中,然后 每次需要获得新的时,在整个应用程序中使用它 您的窗格的实例。
- 在 FXML 文件中定义它,并在每次需要新实例时加载它。
如果您的 Node
具有由用户动态创建或修改的属性或子项,情况会变得更糟。在这种情况下,您必须检查其元素并自行重新创建它们。