簡體   English   中英

如何在JavaFX中的場景圖中克隆節點?

[英]How to clone a node in the scene graph in JavaFX?

我有一個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,所以拍攝快照對我不起作用)

發生此錯誤是因為您試圖將一個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具有由用戶動態創建或修改的屬性或子級,則情況會變得更加糟糕。 在這種情況下,您必須檢查其元素並自行重新創建它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM