JavaFx:ComboBox编辑器的文本

时间:2017-08-01 10:25:11

标签: java javafx combobox javafx-8

我正在使用此答案中建议的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中。

问题:

  • comboBox的文本存储在哪里?
  • 如何更改selectedItemProperty侦听器中的文本?

我认为也许我在某处犯了一个错误,这就是为什么这不起作用,但我不知道是什么,你能帮助我吗?

2 个答案:

答案 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提出了正确的解决方案。

另见the related question