[英]Populate Java FX combobox with a List<String>
我在用列表中的值填充JavaFX中的comboBox時遇到問題。 我對UI開發非常滿意,因此在網上發現的任何內容都對我沒有真正的幫助。 現在,我有了一個Class myClass
,它的方法getNames()
返回List<String>
。 現在,我需要從下拉菜單中選擇該方法的名稱。 我在控制器中嘗試了類似的方法:
ObservableList<String> options = FXCollections.observableArrayList(myClass.getNames());
@FXML
final ComboBox comboBox = new ComboBox(options);
但是當我啟動程序時,我的comboBox仍然為空。 當然,我也將fx:id = "comboBox"
放在.fxml文件中。 我是否錯過了某件事,還是應該使用一種完全不同的方法來做到這一點?
您的ComboBox
帶有@FXML
注釋,這意味着實例將由FXMLLoader
注入。 注入的實例將替換您創建的實例。 您應該改為使用initialize
方法填充ComboBox
(請參閱FXML簡介 )。
import javafx.scene.control.ComboBox;
public class Controller {
@FXML
private ComboBox<String> comboBox;
@FXML
private void initialize() {
// Must declare myClass instance somewhere
comboBox.getItems().setAll(myClass.getNames());
}
}
注意,我還使ComboBox
通用(並且不是final
)。 避免使用原始類型 。
雖然上述說法是正確的,但您使用final
會使事情復雜化。 通過一些快速測試, FXMLLoader
似乎沒有嘗試注入final
字段(這很有意義)。 但是,您創建的ComboBox
與添加到場景圖中的ComboBox
。 換句話說, FXMLLoader
仍然創建自己的ComboBox
,這是用於構建GUI的ComboBox
。
使用FXML創建JavaFX用戶界面 CalliCoder :
FXML加載程序實例化控制器類,使用從fxml文檔中實例化的對象注入控制器類中定義的字段,然后調用控制器的initialize()方法。
和
@FXML批注對於控制器類的私有成員字段是必需的,否則,字段注入將不起作用。 但是,對於公共領域,可以將其省略。
使用問題中提到的以下代碼,您嘗試設置此字段,但是此后,此字段被FXMLLoader
覆蓋。
@FXML
final ComboBox comboBox = new ComboBox(options);
您應該將變量comboBox
初始化為如下形式:
@FXML
private ComboBox comboBox;
然后(在FXMLLoader
注入FXMLLoader
)使用此方法設置此ComboBox
的項目:
@FXML
private void initialize() {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.