[英]How can i use a control more than one time in javafx 8?
我目前正在使用javafx 8,並在一個簡單的解決方案中提出了以下問題:
我有不同的控件( Button
),該控件將出現
Pane
中心 )中 Pane
底部 )中 Button one = new Button("1");
Button two = new Button("2");
Button three = new Button("3");
VBox vbox = new VBox();
vbox.getChildren().addAll(one, two, three);
HBox hbox = new HBox();
hbox.getChildren().addAll(two, three); //To clarify my problem i leave one node in vbox
現在看來,最后一個.addAll()
刪除了另一個框中的引用。
BorderPane root = new BorderPane();
root.setCenter(vbox);
root.setBottom(hbox);
輸出:
我嘗試(用於測試)簡單地重用按鈕,但是:
root.setCenter(one);
root.setBottom(one);
結果是
java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.RuntimeException: Exception in Application start method
...
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@1784a61
那使我考慮以下問題:
HBox
和VBox
節點會發生什么 ? 如Node
類的JavaDocs所述:
一個節點最多可以在場景圖中的任何位置出現一次。 具體來說,一個節點在以下所有所有條件中的出現不得超過一次:作為
Scene
根節點,Parent
的子級ObservableList
或Node
的剪輯。如果程序將子節點添加到
Parent
節點(包括Group
,Region
等),並且該節點已經是其他Parent
節點的子節點或Scene
的根節點,則該節點將自動(且無提示)從其先前的父節點中移除。 。
因此,您無法做您想做的事情。 一個按鈕只能顯示一次,您不能在兩個位置顯示相同的按鈕。 更清楚地說-如果您能夠在兩個地方擁有相同的實例,例如getParent()
方法應該返回什么? 沒什么,這是不可能的。 一個實例只能在一個地方存在。
如果要重復使用該按鈕,則必須將其復制。
在JavaFX中,節點只能在場景圖中使用一次。 這是有道理的,因為一個節點包含一個位置。 如果要使用兩次,則需要兩個位置。
您收到的錯誤
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@1784a6
與場景在vbox中顯示"one" button
以及在hbox中顯示"two"
和"three"
有關。 您只聲明了3個按鈕,而場景只能顯示3個按鈕。 根據我的評論,您需要聲明四個按鈕和五個按鈕,並將它們添加到hbox中,您可能會看到所有五個按鈕。
我不知道為什么會這樣,但是它與控件的初始化有關。 結果還可能是它在vbox中添加了3個按鈕,而在hbox中沒有添加任何按鈕。 但是因為hbox在vbox之后被初始化,所以才將按鈕2和3放在vbox中並丟棄在hbox中(或者實際上拋出異常)的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.