package editablecelltest; import com.sun.javafx.runtime.VersionInfo; import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.ContentDisplay; import javafx.scene.control.SelectionMode; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn.CellEditEvent; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.TextFieldTableCell; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.util.Callback; public class EditableCellTest extends Application { public class Address { private StringProperty street = new SimpleStringProperty(""); private StringProperty city = new SimpleStringProperty(""); private StringProperty state = new SimpleStringProperty(""); public Address() { } public Address(String street, String city, String state) { setStreet(street); setCity(city); setState(state); } public final String getStreet() { return street.get(); } public final void setStreet(String street) { this.street.set(street); } public StringProperty streetProperty() { return street; } public final String getCity() { return city.get(); } public final void setCity(String city) { this.city.set(city); } public StringProperty cityProperty() { return city; } public final String getState() { return state.get(); } public final void setState(String state) { this.state.set(state); } public StringProperty stateProperty() { return state; } } @Override public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("TableViewTextField:" + VersionInfo.getRuntimeVersion()); StackPane root = new StackPane(); final TableView
table = new TableView
(); table.setEditable(true); table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); table.getSelectionModel().setCellSelectionEnabled(true); Callback, TableCell> textCellFactory = new Callback, TableCell>() { @Override public TableCell call(TableColumn p) { return new EditingCell(); } }; // Street column TableColumn streetCol = new TableColumn("Street"); streetCol.setCellValueFactory(new PropertyValueFactory("street")); streetCol.setPrefWidth(150); streetCol.setCellFactory(textCellFactory); streetCol.setOnEditStart(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); streetCol.setOnEditCancel(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); streetCol.setOnEditCommit(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); // City column TableColumn cityCol = new TableColumn("City"); cityCol.setCellValueFactory(new PropertyValueFactory("city")); cityCol.setPrefWidth(150); // cityCol.setCellFactory(textCellFactory); cityCol.setCellFactory(TextFieldTableCell.
forTableColumn()); cityCol.setOnEditStart(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); cityCol.setOnEditCancel(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); cityCol.setOnEditCommit(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); // state column TableColumn stateCol = new TableColumn("State"); stateCol.setCellValueFactory(new PropertyValueFactory("state")); stateCol.setPrefWidth(150); stateCol.setCellFactory(textCellFactory); stateCol.setOnEditStart(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); stateCol.setOnEditCancel(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); stateCol.setOnEditCommit(new EventHandler>() { @Override public void handle(CellEditEvent event) { System.out.println(event); } }); table.getColumns().setAll(streetCol, cityCol, stateCol); ObservableList
addressList = FXCollections.observableArrayList(); addressList.addAll( new Address("123 Main St.", "Anywhere", "FL"), new Address("1600 Pennsylvania St.", "Washington", "DC"), new Address("221 B Baker St.", "London", "UK") ); table.setItems(addressList); root.getChildren().add(table); Scene scene = new Scene(root, 400, 400); primaryStage.setScene(scene); primaryStage.sizeToScene(); primaryStage.show(); } class EditingCell extends TableCell { private TextField textField; public EditingCell() { } @Override public void startEdit() { super.startEdit(); if (isEmpty()) { return; } if (textField == null) { textField = new TextField(); textField.setOnKeyReleased(new EventHandler() { @Override public void handle(KeyEvent t) { if (t.getCode() == KeyCode.ENTER) { System.out.println("committing edit [" + textField.getText() + "]"); commitEdit(textField.getText()); } else if (t.getCode() == KeyCode.ESCAPE) { System.out.println("cancelling edit"); cancelEdit(); } } }); } textField.setText(getItem()); setGraphic(textField); setContentDisplay(ContentDisplay.GRAPHIC_ONLY); textField.requestFocus(); textField.selectAll(); } @Override public void cancelEdit() { super.cancelEdit(); setContentDisplay(ContentDisplay.TEXT_ONLY); } @Override public void commitEdit(String t) { super.commitEdit(t); setContentDisplay(ContentDisplay.TEXT_ONLY); } @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (!isEmpty()) { if (textField != null) { textField.setText(item); } setText(item); setContentDisplay(ContentDisplay.TEXT_ONLY); } } } /** * @param args the command line arguments */ public static void main(String[] args) { Application.launch(args); } }