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);
}
}