Я решил эту проблему, и логика этого решения: -
public class UndoRedo {
private SpreadsheetCell cell;
private String oldValue;
private String newValue;
public UndoRedo(SpreadsheetCell cell, String oldValue, String newValue) {
this.cell = cell;
this.oldValue = oldValue;
this.newValue = newValue;
}
public SpreadsheetCell getCell() {
return cell;
}
public void setCell(SpreadsheetCell cell) {
this.cell = cell;
}
public String getOldValue() {
return oldValue;
}
public void setOldValue(String oldValue) {
this.oldValue = oldValue;
}
public String getNewValue() {
return newValue;
}
public void setNewValue(String newValue) {
this.newValue = newValue;
}
}
добавить событие в SpreadSheet для добавления объекта в список любой операции изменения в ячейке.
mGridBase.addEventHandler(GridChange.GRID_CHANGE_EVENT, (GridChange e) -> {
isCellEdited = true;
SpreadsheetCell cell = mGridBase.getRows().get(e.getRow()).get(e.getColumn());
String oldValue = lastValue;
UndoRedo undoRedo = new UndoRedo(cell, oldValue, cell.getText());
undoRedoList.add(undoRedo);
});
Теперь добавьте событие Key на
Ctrl + Z
для отмены последних изменений
if (KeyCode.Z == event.getCode() && event.isControlDown()) {
if (!undoRedoList.isEmpty()) {
UndoRedo undoRedo = undoRedoList.remove(undoRedoList.size() - 1);
undoRedo.getCell().setItem(undoRedo.getOldValue());
mSpreadsheet.getSelectionModel().clearAndSelect(undoRedo.getCell().getRow(), mSpreadsheet.getColumns().get(undoRedo.getCell().getColumn()));
}
}
А теперь он работает отлично и надежно тогда
Grid grid = ...; Stack<GridChange> undoStack = ...; grid.addEventHandler(GridChange.GRID_CHANGE_EVENT, new EventHandler<GridChange>() {
public void handle(GridChange change) {
undoStack.push(change);
}
});