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