当前位置: 首页 > 面试题库 >

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

轩辕奕
2023-03-14
问题内容

我有一个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都会创建一个新实例。

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



 类似资料:
  • 我看了很多页,试图找出如何切换场景,但都没有成功。 我有一个计算器,我的目标是选择一个菜单选项来更改计算器(即:基础和科学)。现在我只是在测试,所以这里是我到目前为止与这个问题相关的代码(我使用的是场景生成器): 编辑我已经尝试了很多东西。不管怎样,我总是得到这个NullPointerException。我有一种感觉,这可能与在场景生成器中设置某些内容有关,但我就是找不到答案 工作代码: 我使用下

  • 问题内容: 我有一个使用javafx Scene来渲染某些东西的应用程序,并且我想将该渲染结果放入我在Javafx中创建的某些GUI中。我该怎么做? 基本上,有一些容器可以放入场景,然后将其放入GUI。 抱歉,如果是新手问题,我是JavaFX的新手 问题答案: 该场景只有一个顶级父节点作为根。您可以获取它并放入另一个场景。

  • 在public void start(Stage primaryStage)中程序开始时,我制作了A的对象并将其传递给primary Stage,然后在每个类中我更改它,并且它工作得很好。但我对此没有什么疑问: 这是一个正确的方法吗? 有没有其他方法可以在保留类的同时完成它,或者我应该只在主类中完成所有操作? 传递场景然后更改根节点是否更好? 对不起,如果我问得有点多了,但我读了很多关于它仍然没有

  • 我想写一个包含以下类的游戏: 我希望所有这些课程都能在舞台上使用。首先,我启动startUp类,几秒钟后,我想删除startUp stackpane并更改场景(例如从fxml文件读取),但我是javafx中的noob。有什么想法吗?

  • 问题内容: 有没有一种方法可以克隆的实例而无需将其字符串化并重新解析结果? 浅表副本是可以接受的。 问题答案: 使用构造函数和方法。

  • 问题内容: 如何将JavaFX 2中图形的内容输出到。实际上,我正在开发一个基本上设计卡片的应用程序。因此,用户只需单击各种选项即可自定义场景。最后,我想将场景内容导出到图像文件。我怎么做 ? 问题答案: 为此,在FX 2.2中出现了新的快照功能。你可以说 对于较旧的FX,您可以使用AWT机械手。这不是一个很好的方法,因为它需要启动整个AWT堆栈。