我正在使用此答案中建议的comboBox:JavaFx: show DatePicker,但是在显示正确的文本时遇到问题。如果我从DatePicker中选择了一个日期,我试图设置编辑器的文本,但它什么也没发生。 这就是我的尝试:
getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) ->{
if (newValue != null) {
if (MyTupe.DATE.equals(newValue.getType())) {
initDatePicker();
datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
newValue.setValue(newDate);
getEditor().setText(newDate.toString());
datePopOver.hide();
});
StackPane stackPane = new StackPane(datePicker);
stackPane.setPadding(new Insets(10, 10, 10, 10));
datePopOver.setContentNode(stackPane);
datePopOver.show(this);
} else {
datePopOver.hide();
}
}
});
经过多次试验后,我将两个事件添加到编辑器的textProperty和setOnMouseClicked中,如下所示:
getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("Text changed");
});
setOnMouseClicked(event -> {
System.out.println(getEditor().getText());
});
如果我没有手动设置getEditor().setText();
,即使我更改了comboBox的值,也没有触发,这对我来说有点奇怪,因为我认为这个textField包含了comboBox的文本。 (也许我错了?)。如果删除该行,则每次显示空字符串时都会显示mouseClick事件。
如果getEditor().setText();
行在那里,编辑器的getText()将返回正确的文本,但它不会显示在comboBox中。
问题:
我认为也许我在某处犯了一个错误,这就是为什么这不起作用,但我不知道是什么,你能帮助我吗?
答案 0 :(得分:1)
在链接代码中
替换:
// .moveToObject(selector,xoffset,yoffset);
.moveToObject('#button', 0, -103)
.buttonDown()
.moveToObject('#button', 0, -104)
.buttonUp()
使用:
items.set(0, new ComboBoxNode(newDate, DATE_TYPE));
链接代码仅更改位置零处的日期。在此新代码中,相应位置的日期已更改。
完整代码:
items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));
答案 1 :(得分:1)
关于你的问题:comboBox的文本存储在哪里? 通常,JavaFX控件基于MVC架构,其中数据存储在模型中。控件只根据定义的转换器表示模型数据,并自动对模型的任何更改做出反应。
因此,在您的情况下,数据存储在ObservableList items
中。要更新组合框,您只需要用新对象替换相应的项目。
注意,组合框已经监听ObservableList
,任何添加/删除/设置都将在UI端自动显示。
为什么这段代码不起作用:
newValue.setValue(newDate);
因为您更改了项目的内部状态,ObservableList items
不会对此类更改做出反应。只有更改列表才有效。 @Sedrick提出了正确的解决方案。