Java 如何让TextFieldTableCell将焦点丢失处理为提交而不是取消?

Java 如何让TextFieldTableCell将焦点丢失处理为提交而不是取消?,java,javafx,javafx-8,Java,Javafx,Javafx 8,JavaFX中TextFieldTableCell的默认行为是: 点击回车键:提交编辑 按ESC键:取消编辑 焦点丢失:取消编辑 当焦点丢失时取消编辑是非常不自然的,会导致我的用户丢失数据 我已经尝试创建TextFieldTableCell的替代实现,在textfield.focusedProperty()上添加了一个侦听器以强制提交,但这根本不起作用 有人对如何改善这种行为有什么建议吗 My adaptedcreateTextField-函数: private static <T&g

JavaFX中TextFieldTableCell的默认行为是:

  • 点击回车键:提交编辑
  • 按ESC键:取消编辑
  • 焦点丢失:取消编辑
当焦点丢失时取消编辑是非常不自然的,会导致我的用户丢失数据

我已经尝试创建TextFieldTableCell的替代实现,在
textfield.focusedProperty()
上添加了一个侦听器以强制提交,但这根本不起作用

有人对如何改善这种行为有什么建议吗

My adapted
createTextField
-函数:

private static <T> TextField createTextField(final Cell<T> cell, final StringConverter<T> converter) {
    final TextField textField = new TextField(getItemText(cell, converter));

    // Use onAction here rather than onKeyReleased (with check for Enter),
    // as otherwise we encounter RT-34685
    textField.setOnAction(event -> {
        if (converter == null) {
            throw new IllegalStateException(
                    "Attempting to convert text input into Object, but provided "
                            + "StringConverter is null. Be sure to set a StringConverter "
                            + "in your cell factory.");
        }
        cell.commitEdit(converter.fromString(textField.getText()));
        event.consume();
    });
    textField.setOnKeyReleased(t -> {
        if (t.getCode() == KeyCode.ESCAPE) {
            cell.cancelEdit();
            t.consume();
        }
    });

    textField.focusedProperty().addListener(observable -> {
        if (!textField.isFocused()) {
            cell.commitEdit(converter.fromString(textField.getText()));
        }
    });

    return textField;
}
private static TextField createTextField(最终单元格、最终StringConverter转换器){
final TextField TextField=新的TextField(getItemText(单元格,转换器));
//在此处使用onAction而不是onKeyReleased(选中Enter),
//否则我们会遇到RT-34685
textField.setOnAction(事件->{
if(converter==null){
抛出新的非法状态异常(
正在尝试将文本输入转换为对象,但已提供
+“StringConverter为空。请确保设置StringConverter”
+“在你的细胞工厂里。”);
}
committedit(converter.fromString(textField.getText());
event.consume();
});
textField.setOnKeyReleased(t->{
if(t.getCode()==KeyCode.ESCAPE){
cell.cancelEdit();
t、 消费();
}
});
textField.focusedProperty().addListener(可观察->{
如果(!textField.isFocused()){
committedit(converter.fromString(textField.getText());
}
});
返回文本字段;
}

我认为您需要关注单元格本身,并使其提交,以便将其呈现为
文本字段的标签,但我猜您强制提交是没有用的,因为它不再处于编辑模式。。不过我对这部分不太精通。。