UndoManager UndoableEdit 获取与 undo redo(一)

2014-11-24 09:40:01 · 作者: · 浏览: 1
可根据jlist的颜色渲染看出做到哪一步
class UndoListPanel
/* 
 * To change this template, choose Tools | Templates 
 * and open the template in the editor. 
 */  
package NewUndoTest;  
  
import java.awt.BorderLayout;  
import java.awt.Color;  
import java.awt.Component;  
import java.awt.Dimension;  
import java.awt.Font;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import javax.swing.BorderFactory;  
import javax.swing.DefaultListCellRenderer;  
import javax.swing.DefaultListModel;  
import javax.swing.JButton;  
import javax.swing.JList;  
import javax.swing.JPanel;  
import javax.swing.JScrollPane;  
import javax.swing.JToolBar;  
import javax.swing.ListSelectionModel;  
import javax.swing.event.ListSelectionEvent;  
import javax.swing.event.ListSelectionListener;  
import javax.swing.undo.UndoableEdit;  
  
/** 
 * 
 * @author Administrator 
 */  
public class UndoListPanel extends JPanel implements UndoListener {  
  
    // TODO: define the list, listmodel, undo/redo button  
    DefaultListModel undoModel = new DefaultListModel();  
    JList undoList = new JList(undoModel);  
    JScrollPane undoJScrollPane = new JScrollPane(undoList);  
    NewUndoManager newUndoManager;  
    JToolBar toolBar = new JToolBar();  
    JButton undoButton = new JButton("undo");  
    JButton redoButton = new JButton("redo");  
    int firstIndex, secondIndex;  
    //int[] undoIndex;  
    int state;  
  
    public UndoListPanel(final NewUndoManager newUndoManager) {  
        this.newUndoManager = newUndoManager;  
        setLayout(new BorderLayout());  
        newUndoManager.addListener(this);  
  
        undoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        undoJScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);  
        undoJScrollPane.setBorder(BorderFactory.createTitledBorder("Undo"));  
        undoJScrollPane.setPreferredSize(new Dimension(200, 300));  
        toolBar.add(redoButton);  
        toolBar.add(undoButton);  
        add(undoJScrollPane, BorderLayout.NORTH);  
        add(toolBar, BorderLayout.SOUTH);  
  
        undoButton.addActionListener(new ActionListener() {  
            @Override  
            public void actionPerformed(ActionEvent e) {  
                if (newUndoManager.canUndo()) {  
                    newUndoManager.undo();  
                    undoList.setCellRenderer(new MyRenderer(--state, Color.GREEN));  
                    firstIndex--;  
                }  
            }  
        });  
  
        redoButton.addActionListener(new ActionListener() {  
            @Override  
            public void actionPerformed(ActionEvent e) {  
                if (newUndoManager.canRedo()) {  
                    newUndoManager.redo();  
                    undoList.setCellRenderer(new MyRenderer(++state, Color.GREEN));  
                    firstIndex++;  
                }  
            }  
        });  
  
        undoList.addListSelectionListener(new ListSelectionListener() {  
            @Override  
            public void valueChanged(ListSelectionEvent lse) {  
  
                if (undoList.getValueIsAdjusting()) {  
                    state = undoList.getSelectedIndex();  
                    secondIndex = undoList.getSelectedIndex();  
                } else {  
                    firstIndex = undoList.getSelectedIndex();  
                }  
//                undoIndex = new int[secondIndex];  
//                for (int j = 0; j < secondIndex; j++) {  
//                    undoIndex[j] = undoList.getSelectedIndex();  
//                }  
//                MyRenderer renderer = new MyRenderer(undoIndex, Color.yellow);  
//                undoList.setCellRenderer(renderer);  
                undoList.setCellRenderer(new MyRenderer(secondIndex, Color.GREEN));  
  
                if (firstIndex < secondIndex) {  
                    for (int i = firstIndex; i < secondIndex; i++) {  
                        if (newUndoManager.canRedo()) {  
                            newUndoManager.redo();  
                        }  
                    }  
                } else if (firstIndex >
secondIndex) { for (int i = firstIndex; i > secondIndex; i--) { if (newUndoManager.canUndo()) { newUndoManager.undo(); } } } } }); } @Override public void undoChanged() { undoModel.removeAllElements(); for (UndoableEdit edit : newUndoManager.getEdits()) { undoModel.addElement(edit); state = undoModel.size() - 1;