使用List <string>填充Java FX组合框

时间:2018-12-17 20:19:29

标签: java javafx

我在用列表中的值填充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文件中。 我是否错过了某件事,还是应该使用一种完全不同的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

您的ComboBox@FXML注释,这意味着实例将由FXMLLoader注入。注入的实例将替换您创建的实例。您应该改为通过ComboBox方法填充initialize(请参见Introduction to 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)。 Avoid using raw types


尽管上述说法是正确的,但您使用final会使事情复杂化。通过一些快速测试,看来FXMLLoader并没有尝试注入final字段(这很有意义)。但是,您创建的ComboBox与添加到场景图形中的FXMLLoader不同。换句话说,ComboBox仍会创建自己的class Foo { @JsonDeserialize(using = BarDeserializer.class) private Bar some_key; } ,这是用于构建GUI的那个。

答案 1 :(得分:1)

来自Creating JavaFX user interfaces using FXML | CalliCoder

  

FXML加载程序实例化控制器类,注入字段   在控制器类中定义的对象,该对象从   fxml文档,然后调用控制器的initialize()方法。

  

@FXML注释是   对于控制器类的私有成员字段是必需的,   否则,场注入将不起作用。但是,可以将其省略   公共领域。


使用问题中提到的以下代码,您正在尝试设置此字段,但是此后此字段将被FXMLLoader覆盖。

@FXML
final ComboBox comboBox = new ComboBox(options);

您应将变量comboBox初始化为类似这样的内容:

@FXML
private ComboBox comboBox;

然后(在被FXMLLoader注入之后)通过以下方法设置此ComboBox的项目:

@FXML
private void initialize() {

}