最近写一个记事本,写撤销的时候发现一个bug,撤销在刚打开的界面中惯用,但是当我选打开菜单,打开一个文件后,再用撤销就不管用了,查过之后知道是edit不是alive了,那怎么样让它alive呢,怎样才能让撤销一直管用呢
请各位给点思路

解决方案 »

  1.   

    主界面代码
    /**
     * 程序设计题目:java源代码编辑器
     * Author: HUYONG(Designer_Hu)
     * 
     * 2010-12-01
     * 
     */
    package com.huyong.view;import javax.swing.*;
    import javax.swing.event.UndoableEditEvent;
    import javax.swing.event.UndoableEditListener;
    import javax.swing.undo.UndoManager;import java.awt.*;
    import java.awt.event.*;
    import com.huyong.action.*;/**
     * java源代码编辑器的主界面
     * @Author HUYONG
     * 
     */
    public class MainFrame extends JFrame implements ActionListener,WindowListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * 判断文件是否已经存在,存放
     */
    private JLabel label2 = new JLabel();
    /**
     * 存放selectedFile
     */
    private JLabel label = new JLabel();
    //  框架
    private UndoManager undoManager; //undo管理
    private JPanel panel; //中间容器
    private JTextArea textArea; //文本区域
    private JScrollPane scrollBar; //滚动条


    //  菜单
    private JMenuBar menubar;
    private JMenu menu1;
    private JMenu menu2;
    private JMenuItem menuitem1;
    private JMenuItem menuitem2;
    private JMenuItem menuitem3;
    private JMenuItem menuitem4;
    private JMenuItem menuitem5;
    private JMenuItem menuitem6;
    private JMenuItem menuitem7;
    private JMenuItem menuitem8;
    private JMenuItem menuitem9;
    private JMenuItem menuitem10;
    private JMenuItem menuitem11;

    /**
     * 无参构造函数
     */
    public MainFrame() {

    //初始化框架部分
    super("java源代码编辑器" + "   [unexist]" + "编辑中");
    label2.setText("unexist");
    try {
    //设置界面外观为系统默认形式
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
    }
    undoManager = new UndoManager();
    panel = new JPanel();
    panel.setLayout(new BorderLayout());
    textArea = new JTextArea();
    textArea.setFont(new Font("宋体", Font.PLAIN, 16));
    textArea.setTabSize(4); //因为java一般缩进4个字母

    textArea.getDocument().addUndoableEditListener(new UndoableEditListener() {
    public void undoableEditHappened(UndoableEditEvent e) {
    undoManager.addEdit(e.getEdit());
    }
    });

    scrollBar = new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    //初始化菜单部分
    menubar = new JMenuBar();
    menu1 = new JMenu("文件(F)");
    menu1.setMnemonic('F');
    menu2 = new JMenu("编辑(E)");
    menu2.setMnemonic('E');
    menuitem8 = new JMenuItem("新建(N)");
    menuitem8.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_N, InputEvent.CTRL_MASK));
    menuitem1 = new JMenuItem("打开(O)");
    menuitem1.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_O, InputEvent.CTRL_MASK));
    menuitem7 = new JMenuItem("保存(S)");
    menuitem7.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_S, InputEvent.CTRL_MASK));
    menuitem2 = new JMenuItem("另存为");
    menuitem9 = new JMenuItem("退出");
    menuitem3 = new JMenuItem("剪贴(X)");
    menuitem3.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_X, InputEvent.CTRL_MASK));
    menuitem4 = new JMenuItem("粘贴(V)");
    menuitem4.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_V, InputEvent.CTRL_MASK));
    menuitem5 = new JMenuItem("复制(C)");
    menuitem5.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_C, InputEvent.CTRL_MASK));
    menuitem6 = new JMenuItem("查找和替换(F)");
    menuitem6.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_F, InputEvent.CTRL_MASK));
    menuitem10 = new JMenuItem("撤销(Z)");
    menuitem10.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_Z, InputEvent.CTRL_MASK));
    menuitem11 = new JMenuItem("重做");

    //将菜单加到主框架frame中
    menu1.add(menuitem8);
    menu1.addSeparator();
    menu1.add(menuitem1);
    menu1.add(menuitem2);
    menu1.add(menuitem7);
    menu1.addSeparator();
    menu1.add(menuitem9);
    menu2.add(menuitem10);
    menu2.add(menuitem11);
    menu2.addSeparator();
    menu2.add(menuitem3);
    menu2.add(menuitem4);
    menu2.add(menuitem5);
    menu2.addSeparator();
    menu2.add(menuitem6);

    menubar.add(menu1);
    menubar.add(menu2);
    panel.add(menubar,BorderLayout.NORTH);

    //对菜单事件进行添加
    menuitem1.addActionListener(this);
    menuitem2.addActionListener(this);
    menuitem3.addActionListener(this);
    menuitem4.addActionListener(this);
    menuitem5.addActionListener(this);
    menuitem6.addActionListener(this);
    menuitem7.addActionListener(this);
    menuitem8.addActionListener(this);
    menuitem9.addActionListener(this);
    menuitem10.addActionListener(this);
    menuitem11.addActionListener(this);

    panel.add(scrollBar,BorderLayout.CENTER);
    this.add(panel);
    this.setLocation(200, 100);
    setSize(700,600);
    setVisible(true);

    //关闭时事件响应
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    addWindowListener(this);
    }
    /**
     * 主函数入口
     * @param args
     */
    public static void main(String args[]) {
        new MainFrame();
    }
    /**
     * 事件响应
     * @param e 
     */
    public void actionPerformed(ActionEvent e) {
    if ((JMenuItem)e.getSource() == menuitem1) {
    OpenAction.openFile(this, textArea, label2, label, undoManager);
    }
    if ((JMenuItem)e.getSource() == menuitem2) {
    ResaveAction.saveFile(this, textArea, label2, label);
    }
    if ((JMenuItem)e.getSource() == menuitem3) {
    CutAction.cut(textArea);
    }
    if ((JMenuItem)e.getSource() == menuitem4) {
    PasteAction.cut(textArea);
    }
    if ((JMenuItem)e.getSource() == menuitem5) {
    CopyAction.cut(textArea);
    }
    if ((JMenuItem)e.getSource() == menuitem6) {
    new SearchAction(this,textArea);
    }
    if ((JMenuItem)e.getSource() == menuitem7) {
    SaveAction.saveFile(this, textArea, label2, label);
    }
    if ((JMenuItem)e.getSource() == menuitem8) {
    NewFoundAction.newFound(this, textArea, label2, label);
    }
    if ((JMenuItem)e.getSource() == menuitem9) {
    CloseAction.closeWindow(this, textArea, label2, label);
    }
    if ((JMenuItem)e.getSource() == menuitem10) {
    UndoAction.undo(undoManager);
    }
    if ((JMenuItem)e.getSource() == menuitem11) {
    RedoAction.redo(undoManager);
    }
    }

    public void windowOpened(WindowEvent e) { 
    }
    /**
     * 点击关闭窗口,提示保存
     * @param e
     * 
     */
    public void windowClosing(WindowEvent e) {
    CloseAction.closeWindow(this, textArea, label2, label);

    public void windowClosed(WindowEvent e) { 

    public void windowIconified(WindowEvent e) { 

    public void windowDeiconified(WindowEvent e) { 

    public void windowActivated(WindowEvent e) { 

    public void windowDeactivated(WindowEvent e) { 
    }
    }
      

  2.   

    undo 代码
    package com.huyong.action;import javax.swing.undo.UndoManager;/**
     * 对菜单活动事件撤销的实现
     * @author HUYONG
     *
     */
    public class UndoAction {
    /**
     * 实现撤销功能
     * @param undoManager
     */
    public static void undo(UndoManager undoManager) {
    if (undoManager.canUndo()) {
    undoManager.undo();
    }
    }
    }
      

  3.   

    看看这个方法
    OpenAction.openFile(this, textArea, label2, label, undoManager);问题应该出在这里面
      

  4.   

    独立开个stack!你那个应该是打开信文件的时候覆盖了!