簡體   English   中英

用列表填充Java FX組合框<String>

[英]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.

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