Java 动态显示日期选择器

Java 动态显示日期选择器,java,swing,javafx,datepicker,javafx-8,Java,Swing,Javafx,Datepicker,Javafx 8,我正在编写一个JavaFX应用程序,它显示了一个包含StringProperty和objectproperty值的表。当我深入研究表的工作方式时,似乎我无法将日期选择器用作单元格,因此我计划将日期显示为字符串,但当用户尝试编辑该单元格时,我捕获该事件并显示一个动态日期选择器,它将接受新的日期值并更新单元格 现在,我很难让这个动态的日期选择器出现 JavaFX: <TableView fx:id="tableView" editable="true" GridPane.columnI

我正在编写一个JavaFX应用程序,它显示了一个包含
StringProperty
objectproperty
值的表。当我深入研究表的工作方式时,似乎我无法将
日期选择器
用作单元格,因此我计划将日期显示为字符串,但当用户尝试编辑该单元格时,我捕获该事件并显示一个动态
日期选择器
,它将接受新的日期值并更新单元格

现在,我很难让这个动态的
日期选择器出现

JavaFX:

    <TableView fx:id="tableView" editable="true" GridPane.columnIndex="0" GridPane.rowIndex="1">
        <columns>
         ...
        <TableColumn fx:id="recDate" onEditStart="#handleChangeDate" prefWidth="100.0" text="Received Date">
            <cellValueFactory>
                <PropertyValueFactory property="recDate" />
                <!-- <DatePicker fx:id="recDatePicker" /> -->
            </cellValueFactory>
        </TableColumn>
         ...

...
...
Java 8:

@FXML
private void handleChangeDate(CellEditEvent<MissionItem, LocalDate> e) {
    final DatePicker dp = new DatePicker(e.getOldValue());
    dp.setDisable(false);
    dp.setOnAction(event -> {
        LocalDate date = dp.getValue();
        System.out.println("Selected date: " + date);
    });
    Platform.runLater(dp::show);
    dp.show(); //redundant. Still doesn't work.
    System.out.println("fired event");
}
@FXML
私有无效handleChangeDate(Celledite事件){
final DatePicker dp=新的日期选择器(e.getOldValue());
dp.setDisable(假);
dp.设置动作(事件->{
LocalDate=dp.getValue();
系统输出打印项次(“所选日期:+日期);
});
Platform.runLater(dp::show);
dp.show();//冗余。仍然无法工作。
System.out.println(“激发事件”);
}
我可以看到
触发事件
,但是
日期选择器
从未出现

我的目标是:

  • 将表显示为一组字符串/LocalDates
  • 假设一个单元格本身不能是一个日期选择器,那么就需要一个事件处理程序,这样当用户想要编辑一个日期单元格时,就会出现一个动态日期选择器,它接受用户输入,并且值会更新
  • 确保这可缩放1000行

要自定义列的单元格,您需要在此列的
单元格工厂中创建适当的
表格单元格
s:

public class DatePickerTableCell<T> extends TableCell<T, LocalDate> {

    private final DatePicker datePicker;
    private boolean listening = true;

    // listener for changes in the datepicker
    private final ChangeListener<LocalDate> listener = (observable, oldValue, newValue) -> {
        if (listening) {
            listening = false;

            TableColumn<T, LocalDate> column = getTableColumn();
            EventHandler<TableColumn.CellEditEvent<T, LocalDate>> handler = column.getOnEditCommit();
            if (handler != null) {
                // use TableColumn.onEditCommit if there is a handler
                handler.handle(new TableColumn.CellEditEvent<>(
                        (TableView<T>) getTableView(),
                        new TablePosition<T, LocalDate>(getTableView(), getIndex(), column),
                        TableColumn.<T, LocalDate>editCommitEvent(),
                        newValue
                ));
            } else {
                // otherwise check if ObservableValue from cellValueFactory is
                // also writable and use in that case
                ObservableValue<LocalDate> observableValue = column.getCellObservableValue((T) getTableRow().getItem());
                if (observableValue instanceof WritableValue) {
                    ((WritableValue) observableValue).setValue(newValue);
                }
            }

            listening = true;
        }
    };

    public DatePickerTableCell() {
        this.datePicker = new DatePicker();
        this.datePicker.valueProperty().addListener(listener);
    }

    @Override
    protected void updateItem(LocalDate item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            listening = false;
            setGraphic(null);
        } else {
            listening = false;
            setGraphic(this.datePicker);
            this.datePicker.setValue(item);
            listening = true;
        }
    }

    public static <E> Callback<TableColumn<E, LocalDate>, TableCell<E, LocalDate>> forTableColumn() {
        return column -> new DatePickerTableCell<>();
    }

}

(需要在fxml中包含适当的导入指令。)

您需要将
日期选择器添加到场景中这确实有效,但是我正在尝试将原始源值填充到
日期选择器
构造函数中,但是我发现原始值都为null?
新的日期选择器(this.getItem());
this.getItem()
当它至少应该是进入单元格的原始值时,它总是返回null…感谢您的编辑,它工作了!我猜侦听器在默认情况下应该设置为true。赋值应该在
updateItem
方法中完成,因为最初所有单元格都是空的,项目为
null
。但是,代码中有一个bug阻止了初始更新。很抱歉。