自定义TextFieldTableCell 失焦即commit文本

package com.bokesoft.developsuit.commondata.util.boketablecell;

import com.bokesoft.developsuit.commondata.DataObjectTableParameter;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.util.Callback;
import javafx.util.StringConverter;
import javafx.util.converter.DefaultStringConverter;

/**
 * Author: zsy
 * Created Date: 2021/3/8 11:21
 **/
public class BokeTableCell<S, T> extends TableCell<S, T> {

    private TextField textField;

    private ObjectProperty<StringConverter<T>> converter =
            new SimpleObjectProperty<StringConverter<T>>(this, "converter");

    public final ObjectProperty<StringConverter<T>> converterProperty() {
        return converter;
    }

    public final void setConverter(StringConverter<T> value) {
        converterProperty().set(value);
    }

    public final StringConverter<T> getConverter() {
        return converterProperty().get();
    }


    public static <S> Callback<TableColumn<S, String>, TableCell<S, String>> forTableColumn() {
        return forTableColumn(new DefaultStringConverter());
    }

    public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> forTableColumn(
            final StringConverter<T> converter) {
        return new Callback<TableColumn<S, T>, TableCell<S, T>>() {
            @Override
            public TableCell<S, T> call(TableColumn<S, T> param) {
                return new BokeTableCell<S, T>(converter);
            }
        };
    }

    public BokeTableCell() {
        this(null);
    }

    public BokeTableCell(StringConverter<T> converter) {
        this.getStyleClass().add("text-field-table-cell");

        this.textField = new TextField();

        setGraphic(null);

        setConverter(converter);

        this.setOnKeyReleased(new EventHandler<KeyEvent>() {
            public void handle(KeyEvent event) {
                BokeTableCell<S, T> self = BokeTableCell.this;
                if (event.getCode() == KeyCode.ENTER) {
                    String text = self.textField.getText();
                    self.commitEdit(self.getConverter().fromString(text));
                } else if (event.getCode() == KeyCode.ESCAPE) {
                    self.cancelEdit();
                }

                event.consume();
            }
        });
    }

    @Override
    public void startEdit() {
        super.startEdit();

        if (isEditing()) {

            this.setGraphic(this.textField);

            this.textField.setText((String) this.getItem());
            this.textField.selectAll();
            this.textField.requestFocus();

            this.textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    BokeTableCell self = BokeTableCell.this;
                    if (!newValue) {
                        commitEdit((T) self.textField.getText());
                    }
                }
            });


        }
    }

    @Override
    public void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);

        if (this.isEmpty()) {
            this.setText(null);
            this.setGraphic(null);
        } else {
            this.setText(this.getItemText());
        }
    }

    @Override
    public void commitEdit(T newValue) {
        super.commitEdit(newValue);

        this.setItem(newValue);
        this.setGraphic(null);
        this.setText(this.getItemText());
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();

        this.setText(this.getItemText());
        this.setGraphic(null);
    }

    private String getItemText() {
        StringConverter<T> converter = this.getConverter();
        return converter == null ?
                this.getItem() == null ? "" : this.getItem().toString() :
                converter.toString(this.getItem());
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值