Created
August 1, 2019 07:55
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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