Skip to content

Instantly share code, notes, and snippets.

@b3b00
Created August 1, 2019 07:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save b3b00/26108b01db0d2e0aa829bad996243f0f to your computer and use it in GitHub Desktop.
Save b3b00/26108b01db0d2e0aa829bad996243f0f to your computer and use it in GitHub Desktop.
JavaFX : textfield editing cell with tab (shift+tab) moving to next (previous) cell
package org.pcp.tournament.infra;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.control.*;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class EditingCell<D> extends TableCell<D, String> {
private TextField textField;
public EditingCell() {
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
if (textField == null) {
createTextField();
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(() ->
{
textField.requestFocus();
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());
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
} else {
TableView<D> table = getTableView();
table.getColumns().get(0).setVisible(false);//////////////my new line
table.getColumns().get(0).setVisible(true);///////////////my new line
setText(getString());
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
}
private void createTextField() {
textField = new TextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()
* 2);
textField.focusedProperty().addListener(
(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) -> {
if (!arg2) {
commitEdit(textField.getText());
}
}
);
textField.setOnKeyPressed(t -> {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
} else if (t.getCode() == KeyCode.TAB) {
commitEdit(textField.getText());
Point newPosition = getNextCellPosition(!t.isShiftDown());
if (newPosition != null) {
getTableView().edit(newPosition.y,
getTableView().getColumns().get(newPosition.x));
}
else {
getTableView().edit(getTableRow().getIndex(),
getTableColumn());
;
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
private Point getNextCellPosition(boolean forward) {
int columnCount = getTableView().getColumns().size();
int rowCount = getTableView().getItems().size();
int currentRow = getTableRow().getIndex();
int newRow = currentRow;
int newColumn = 0;
java.util.List<TableColumn<D, ?>> columns = new ArrayList<>();
for (TableColumn<D, ?> column : getTableView().getColumns()) {
columns.addAll(getLeaves(column));
}
int currentColumn = columns.indexOf(getTableColumn());
newColumn = currentColumn;
if (currentColumn == 0 && currentRow == 0 && !forward) {
System.out.println("not moving : cant go backward");
return null;
}
if (currentColumn == columnCount-1 && currentRow == rowCount-1 && forward) {
System.out.println("not moving : cant go forward");
return null;
}
if (forward) {
if (currentColumn == columnCount-1) {
newColumn = 0;
newRow ++;
}
else {
newColumn++;
}
}
else {
if (currentColumn == 0) {
newRow--;
newColumn = columnCount-1;
}
else {
newColumn--;
}
}
System.out.println("from "+currentColumn+","+currentRow+" to "+newColumn+","+newRow+"");
return new Point(newColumn,newRow);
}
private java.util.List<TableColumn<D, ?>> getLeaves(
TableColumn<D, ?> root) {
List<TableColumn<D, ?>> columns = new ArrayList<>();
if (root.getColumns().isEmpty()) {
// We only want the leaves that are editable.
if (root.isEditable()) {
columns.add(root);
}
return columns;
} else {
for (TableColumn<D, ?> column : root.getColumns()) {
columns.addAll(getLeaves(column));
}
return columns;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment