簡體   English   中英

如何在javafx 8中多次使用控件?

[英]How can i use a control more than one time in javafx 8?

我目前正在使用javafx 8,並在一個簡單的解決方案中提出了以下問題:

我有不同的控件( Button ),該控件將出現

  1. 在主要內容( Pane 中心 )中
  2. 在頁腳( 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);

輸出:

gui

我嘗試(用於測試)簡單地重用按鈕,但是:

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

那使我考慮以下問題:

  • 除了創建新的按鈕實例之外,是否有其他方法可以解決此問題?
  • HBoxVBox節點會發生什么
  • 為什么控件不能重用?

Node類的JavaDocs所述:

一個節點最多可以在場景圖中的任何位置出現一次。 具體來說,一個節點在以下所有所有條件中的出現不得超過一次:作為Scene根節點, Parent的子級ObservableListNode的剪輯。

如果程序將子節點添加到Parent節點(包括GroupRegion等),並且該節點已經是其他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.

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