package com.digiarea.closure.model.providers; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TextField; import javafx.util.Callback; import com.digiarea.closure.model.Node; public class TextfieldTableCell extends TableCell<Node, String> { private TextField textField; public TextfieldTableCell() { } public static Callback<TableColumn<Node, String>, TableCell<Node, String>> getFactory() { return new TextfieldTableCell.TextfieldCellFactory(); } private static class TextfieldCellFactory implements Callback<TableColumn<Node, String>, TableCell<Node, String>> { @Override public TableCell<Node, String> call(TableColumn<Node, String> arg0) { return new com.digiarea.closure.model.providers.TextfieldTableCell(); } } @Override public void startEdit() { if (!isEditable() || !getTableView().isEditable() || !getTableColumn().isEditable()) { return; } if (!isEmpty()) { super.startEdit(); createTextField(); setText(null); setGraphic(textField); textField.selectAll(); } } @Override public void cancelEdit() { super.cancelEdit(); setText((String) getItem()); setGraphic(null); } @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (empty) { setText(null); setGraphic(null); } else { if (isEditing()) { if (textField != null) { textField.setText(getString()); } setText(null); setGraphic(textField); } else { setText(getString()); setGraphic(null); } } } private void createTextField() { textField = new TextField(getString()); textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2); textField.focusedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) { if (!arg2) { commitEdit(textField.getText()); } } }); } private String getString() { return getItem() == null ? "" : getItem().toString(); } }