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()); } }
自定义TextFieldTableCell 失焦即commit文本
最新推荐文章于 2022-03-03 21:41:12 发布