java记事本编写中 实现撤销的undo用法问题 最近写一个记事本,写撤销的时候发现一个bug,撤销在刚打开的界面中惯用,但是当我选打开菜单,打开一个文件后,再用撤销就不管用了,查过之后知道是edit不是alive了,那怎么样让它alive呢,怎样才能让撤销一直管用呢请各位给点思路 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 主界面代码/** * 程序设计题目: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) { }} 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(); } }} 看看这个方法OpenAction.openFile(this, textArea, label2, label, undoManager);问题应该出在这里面 独立开个stack!你那个应该是打开信文件的时候覆盖了! 一个非技术概念问题 关于调用一个继承serializable接口的类遇到的奇怪问题,高分相赠!!! abstract Method可以直接调用? 教一下好吗?没钱去上培训啊 找做JAVA应用程序的资料 在linux下如何运行.jar(java包)???! 动态的可以用java吗? 谁有InstallAnyWhere的注册号?? to skyyoung(路人甲):还是那个编译java原文件的问题,假如要连续编译2个,而这两个有关联关系!! How to add a Calendar & clock to web and got date&time ? 我们是靠什么吃饭的群体? 提供一些面试题
/**
* 程序设计题目: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) {
}
}
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();
}
}
}
OpenAction.openFile(this, textArea, label2, label, undoManager);问题应该出在这里面