JavaFXTableCell中的日期选择器

JavaFXTableCell中的日期选择器,javafx,tablecell,Javafx,Tablecell,我已经实现了一个自定义datePickerTableCell来在单元格编辑中显示日期选择器。我正在使用ExtFX日期选择器()。一切正常,除了当我手动输入日期而不是从选择器中选择日期时,我在committedit()上得到一个NullPointerException datePicker.setOnKeyPressed(新的EventHandler(){ @凌驾 公共无效句柄(KeyEvent t){ if(t.getCode()==KeyCode.ENTER){ 如果(getItem()==n

我已经实现了一个自定义datePickerTableCell来在单元格编辑中显示日期选择器。我正在使用ExtFX日期选择器()。一切正常,除了当我手动输入日期而不是从选择器中选择日期时,我在committedit()上得到一个NullPointerException

datePicker.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent t){
if(t.getCode()==KeyCode.ENTER){
如果(getItem()==null){
提交(空);
}否则{
提交它(getItem());
}
}else if(t.getCode()==KeyCode.ESCAPE){
取消编辑();
}
}
});

我找不到这里出了什么问题。

看看是否有帮助。它使用Java8和DatePicker控件

可能也有帮助。它在Java8中使用了一个日期选择器和TableView控件。

请看一下这个示例。它使用颜色选择器,但也适用于日期选择器:

public class ColorTableCell<T> extends TableCell<T, Color> {    
    private final ColorPicker colorPicker;

    public ColorTableCell(TableColumn<T, Color> column) {
        this.colorPicker = new ColorPicker();
        this.colorPicker.editableProperty().bind(column.editableProperty());
        this.colorPicker.disableProperty().bind(column.editableProperty().not());
        this.colorPicker.setOnShowing(event -> {
            final TableView<T> tableView = getTableView();
            tableView.getSelectionModel().select(getTableRow().getIndex());
            tableView.edit(tableView.getSelectionModel().getSelectedIndex(), column);       
        });
        this.colorPicker.valueProperty().addListener((observable, oldValue, newValue) -> {
            if(isEditing()) {
                commitEdit(newValue);
            }
        });     
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

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

        setText(null);  
        if(empty) {     
            setGraphic(null);
        } else {        
            this.colorPicker.setValue(item);
            this.setGraphic(this.colorPicker);
        } 
    }
}
公共类ColorTableCell扩展了TableCell{
私人最终配色机配色机;
公共ColorTableCell(TableColumn列){
this.colorPicker=新的colorPicker();
this.colorPicker.editableProperty().bind(column.editableProperty());
this.colorPicker.disableProperty().bind(column.editableProperty().not());
this.colorPicker.setOnShowing(事件->{
final TableView TableView=getTableView();
tableView.getSelectionModel().select(getTableRow().getIndex());
编辑(tableView.getSelectionModel().getSelectedIndex(),列);
});
this.colorPicker.valueProperty().addListener((可观察、旧值、新值)->{
if(isEditing()){
承诺IT(新价值);
}
});     
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
}
@凌驾
受保护的void updateItem(颜色项,布尔值为空){
super.updateItem(项,空);
setText(空);
如果(空){
设置图形(空);
}否则{
this.colorPicker.setValue(项);
this.setGraphic(this.colorPicker);
} 
}
}

如果您使用的是Java7,请使用匿名内部类替换lambdas,但它也应该可以工作。完整的博客帖子是。

我在使用
TextArea
作为表格单元格时遇到了类似的问题。问题是我在
TableCell
实现中使用了
startEdit
。使用
TableView#edit
而不是
startEdit
解决了问题。

哪一行出现空指针异常?该示例与我的实现看起来没有任何不同。我发现行提交了它(getItem());getItem()保存的是旧值。甚至在按enter键提交之前,我看到了NullPointerException
public class ColorTableCell<T> extends TableCell<T, Color> {    
    private final ColorPicker colorPicker;

    public ColorTableCell(TableColumn<T, Color> column) {
        this.colorPicker = new ColorPicker();
        this.colorPicker.editableProperty().bind(column.editableProperty());
        this.colorPicker.disableProperty().bind(column.editableProperty().not());
        this.colorPicker.setOnShowing(event -> {
            final TableView<T> tableView = getTableView();
            tableView.getSelectionModel().select(getTableRow().getIndex());
            tableView.edit(tableView.getSelectionModel().getSelectedIndex(), column);       
        });
        this.colorPicker.valueProperty().addListener((observable, oldValue, newValue) -> {
            if(isEditing()) {
                commitEdit(newValue);
            }
        });     
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

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

        setText(null);  
        if(empty) {     
            setGraphic(null);
        } else {        
            this.colorPicker.setValue(item);
            this.setGraphic(this.colorPicker);
        } 
    }
}