public UndoableTableModel(int rowCount, int columnCount) { super(rowCount, columnCount); } public void setValueAt(Object aValue, int row, int column) { undoManager.addEdit( new EditCellValueEdit(this, row, column, getValueAt(row, column), aValue)); setValueAtImpl(aValue, row, column); }
public void setValueAtImpl(Object aValue, int row, int column) { super.setValueAt(aValue, row, column); }
public void undo() { if (undoManager.canUndo()) { undoManager.undo(); } }
public void redo() { if (undoManager.canRedo()) { undoManager.redo(); } } public static void main(String[] args) { final UndoableTableModel model = new UndoableTableModel(50, 5); JTable table = new JTable(model);
Action undoAction = new AbstractAction() { { putValue(NAME, "Undo"); } public void actionPerformed(ActionEvent e) { model.undo(); } }; Action redoAction = new AbstractAction() { { putValue(NAME, "Redo"); }
public void actionPerformed(ActionEvent e) { model.redo(); } }; JToolBar toolbar = new JToolBar(); toolbar.add(undoAction); toolbar.add(redoAction);
JFrame f = new JFrame(); f.getContentPane().add(toolbar, BorderLayout.NORTH); f.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER); f.pack(); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true);
} }class EditCellValueEdit extends AbstractUndoableEdit { private UndoableTableModel model = null; private int column; private int row; private Object oldValue; private Object newValue;
import java.awt.event.ActionEvent;
这个类只实现了单元格编辑的撤销和重做,不能对这个模型进行插入行和删除行的操作,否则可能会导致错误。import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.undo.AbstractUndoableEdit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;public class UndoableTableModel
extends DefaultTableModel
{
private UndoManager undoManager = new UndoManager();
public UndoableTableModel(int rowCount, int columnCount)
{
super(rowCount, columnCount);
} public void setValueAt(Object aValue, int row, int column)
{
undoManager.addEdit(
new EditCellValueEdit(this, row, column,
getValueAt(row, column), aValue));
setValueAtImpl(aValue, row, column);
}
public void setValueAtImpl(Object aValue, int row, int column)
{
super.setValueAt(aValue, row, column);
}
public void undo() {
if (undoManager.canUndo()) {
undoManager.undo();
}
}
public void redo()
{
if (undoManager.canRedo()) {
undoManager.redo();
}
} public static void main(String[] args)
{
final UndoableTableModel model = new UndoableTableModel(50, 5);
JTable table = new JTable(model);
Action undoAction = new AbstractAction() {
{ putValue(NAME, "Undo"); } public void actionPerformed(ActionEvent e)
{
model.undo();
}
}; Action redoAction = new AbstractAction() {
{ putValue(NAME, "Redo"); }
public void actionPerformed(ActionEvent e)
{
model.redo();
}
};
JToolBar toolbar = new JToolBar();
toolbar.add(undoAction);
toolbar.add(redoAction);
JFrame f = new JFrame();
f.getContentPane().add(toolbar, BorderLayout.NORTH);
f.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}class EditCellValueEdit extends AbstractUndoableEdit {
private UndoableTableModel model = null;
private int column;
private int row;
private Object oldValue;
private Object newValue;
public EditCellValueEdit(UndoableTableModel model, int row, int column, Object oldValue, Object newValue)
{
this.model = model;
this.row = row;
this.column = column;
this.oldValue = oldValue;
this.newValue = newValue;
} public void undo() throws CannotUndoException
{
super.undo();
model.setValueAtImpl(oldValue, row, column);
} public void redo() throws CannotRedoException
{
super.redo();
model.setValueAtImpl(newValue, row, column);
}
}