hi,
   我想对表格的单元格编辑添加undo操作,只知道用UndoManager,其他的现在还一片茫然
   能给点建议吗?
   非常感谢

解决方案 »

  1.   

    import java.awt.BorderLayout;
    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);
    }
    }