这个学期,我们学习了Java编程,期末之时老师要我们编个记事本作为这门课程的课程设计,我写了一个,大体上的功能都实现了,只有"撤销"的功能没有实现,请各位大虾指点一下,“撤销”的算法,不甚感激! 特将记事本的源码附下,请大家指点,看还有没有更简洁高效的算法,请不要吝啬,我的E-mail:yangyong@ccsu.cn,欢迎大家来信指点!
/* * *题目:记事本程序 *Author: Jeason * * 2004-12-20 * **/ package jeason; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.util.*; import java.text.*; public class Jsb{ /// boolean dirty=true; String filename=""; String strtext=""; /////////////////////////////////// ////////// Menu //////////////// /////////////////////// JFrame frame=new JFrame("我的记事本"); JPopupMenu pop=new JPopupMenu("弹出"); JTextArea text=new JTextArea(); JLabel statubar=new JLabel("状态栏"); JMenuBar Mbar=new JMenuBar(); JFileChooser jFileChooser1=new JFileChooser(); JColorChooser jColor=new JColorChooser(); JMenu jFile=new JMenu("文件"); JMenu jEdit=new JMenu("编辑"); JMenu jFormat=new JMenu("格式"); JMenu jHelp=new JMenu("帮助"); JMenuItem jnew=new JMenuItem("新建(N)"); public Jsb(){ ///无参数的构造函数 /// this.dirty=false; ///// final BorderLayout borderLayout1=new BorderLayout(); frame.setSize(600,500);// frame.addWindowListener(new Jsb_frame_closingAdapter(this)); JPanel panel=new JPanel(); panel.setLayout(borderLayout1);//布局 panel.add(new JScrollPane(text));//滚动条 panel.add(statubar,borderLayout1.SOUTH); frame.getContentPane().add(panel); // frame.setJMenuBar(Mbar); //将主菜单添加到窗体中 /* * jnew **/ //jnew jnew.addActionListener(new File_new_actionAdapter(this)); jnew.setMnemonic(´N´);//N上下划线 jnew.setAccelerator(KeyStroke.getKeyStroke(´N´,java.awt.Event.CTRL_MASK,true)); //快捷方式 /* * jopen **/ JMenuItem jopen=new JMenuItem("打开(O)");//jopen jopen.addActionListener(new File_open_actionAdapter(this)); jopen.setMnemonic(´O´); jopen.setAccelerator(KeyStroke.getKeyStroke(´O´,java.awt.Event.CTRL_MASK,true)); /* * jsave **/ JMenuItem jsave=new JMenuItem("保存(S)"); jsave.addActionListener(new File_save_actionAdapter(this)); jsave.setMnemonic(´S´); jsave.setAccelerator(KeyStroke.getKeyStroke(´S´,java.awt.Event.CTRL_MASK,true)); /* * jsave as **/ JMenuItem jsaveas=new JMenuItem("另存为..."); jsaveas.addActionListener(new File_saveas_actionAdapter(this)); /* * jquite **/ JMenuItem jquite=new JMenuItem("关闭(Q)"); jquite.addActionListener(new File_quite_actionAdapter(this)); jquite.setMnemonic(´Q´); jquite.setAccelerator(KeyStroke.getKeyStroke(´Q´,java.awt.Event.CTRL_MASK,true)); //------------------------------------ // jFile code of end //-------------------------------------- /** * jEdit code */ //jundo JMenuItem jundo=new JMenuItem("撤销(U)"); jundo.addActionListener(new Edit_undo_actionAdapter(this)); jundo.setMnemonic(´U´); jundo.setAccelerator(KeyStroke.getKeyStroke(´U´,java.awt.Event.CTRL_MASK,true)); /* * jcut **/ JMenuItem jcut=new JMenuItem("剪切(X)"); jcut.addActionListener(new Edit_cut_actionAdapter(this)); jcut.setMnemonic(´X´); jcut.setAccelerator(KeyStroke.getKeyStroke(´X´,java.awt.Event.CTRL_MASK,true)); /* * jcopy **/ JMenuItem jcopy=new JMenuItem("复制(C)"); jcopy.addActionListener(new Edit_copy_actionAdapter(this)); jcopy.setMnemonic(´C´); jcopy.setAccelerator(KeyStroke.getKeyStroke(´C´,java.awt.Event.CTRL_MASK,true)); /* * jpaste **/ JMenuItem jpaste=new JMenuItem("粘贴(V)"); jpaste.addActionListener(new Edit_paste_actionAdapter(this)); jpaste.setMnemonic(´V´); jpaste.setAccelerator(KeyStroke.getKeyStroke(´V´,java.awt.Event.CTRL_MASK,true)); /* * jdelete **/ JMenuItem jdelete=new JMenuItem("删除(D)"); jdelete.addActionListener(new Edit_delete_actionAdapter(this)); jdelete.setMnemonic(´D´); jdelete.setAccelerator(KeyStroke.getKeyStroke(´D´,java.awt.Event.CTRL_MASK,true)); /* * jfind **/ JMenuItem jfind=new JMenuItem("查找(F)"); jfind.addActionListener(new Edit_find_actionAdapter(this)); jfind.setMnemonic(´F´); jfind.setAccelerator(KeyStroke.getKeyStroke(´F´,java.awt.Event.CTRL_MASK,true)); /* * jreplace **/ JMenuItem jreplace=new JMenuItem("替换(R)"); jreplace.addActionListener(new Edit_replace_actionAdapter(this)); jreplace.setMnemonic(´R´); jreplace.setAccelerator(KeyStroke.getKeyStroke(´R´,java.awt.Event.CTRL_MASK,true)); /* *jselectall **/ JMenuItem jselectall=new JMenuItem("全选(A)"); jselectall.addActionListener(new Edit_selectall_actionAdapter(this)); jselectall.setMnemonic(´A´); jselectall.setAccelerator(KeyStroke.getKeyStroke(´A´,java.awt.Event.CTRL_MASK,true)); /* * jdate **/ JMenuItem jdate=new JMenuItem("日期/时间(T)"); jdate.addActionListener(new Edit_timedate_actionAdapter(this)); jdate.setMnemonic(´T´); jdate.setAccelerator(KeyStroke.getKeyStroke(´T´,java.awt.Event.CTRL_MASK,true)); //------------------------------ // jEdit code of end // //----------------------------- /* * jWord **/ JMenuItem jword=new JMenuItem("自动换行"); jword.addActionListener(new Format_word_actionAdapter(this)); /* * jfont **/ JMenuItem jfont=new JMenuItem("字体.."); jfont.addActionListener(new Format_font_actionAdapter(this)); /* * jcolor **/ JMenuItem jcolor=new JMenuItem("颜色..."); jcolor.addActionListener(new Format_color_actionAdapter(this)); //-------------------------------------------------- // jFormat code of end //-------------------------------------------------- /* * jabout **/ JMenuItem jabout=new JMenuItem("关于作者(A)"); jabout.addActionListener(new Help_about_actionAdapter(this)); jabout.setMnemonic(´A´); jabout.setAccelerator(KeyStroke.getKeyStroke(´A´,java.awt.Event.CTRL_MASK,true)); //------------------------------------------------- // jHelp code of end //------------------------------------------------------ /************************************************* *------------------------------------------------ * PopupMenuItem *------------------------------------------------ *************************************************/ /* * pundo **/ JMenuItem pundo=new JMenuItem("撤销(U)"); pundo.addActionListener(new Pop_undo_actionAdapter(this)); pundo.setMnemonic(´U´); pundo.setAccelerator(KeyStroke.getKeyStroke(´U´,java.awt.Event.CTRL_MASK,true)); /* * pcut **/ JMenuItem pcut=new JMenuItem("剪切(X)"); pcut.addActionListener(new Pop_cut_actionAdapter(this)); pcut.setMnemonic(´X´); pcut.setAccelerator(KeyStroke.getKeyStroke(´X´,java.awt.Event.CTRL_MASK,true)); /* * pcopy **/ JMenuItem pcopy=new JMenuItem("复制(C)"); pcopy.addActionListener(new Pop_copy_actionAdapter(this)); pcopy.setMnemonic(´C´); pcopy.setAccelerator(KeyStroke.getKeyStroke(´C´,java.awt.Event.CTRL_MASK,true)); /* * ppaste **/ JMenuItem ppaste=new JMenuItem("粘贴(V)"); ppaste.addActionListener(new Pop_paste_actionAdapter(this)); ppaste.setMnemonic(´V´); ppaste.setAccelerator(KeyStroke.getKeyStroke(´V´,java.awt.Event.CTRL_MASK,true)); /* *pdelete **/ JMenuItem pdelete=new JMenuItem("删除(D)"); pdelete.addActionListener(new Pop_delete_actionAdapter(this)); pdelete.setMnemonic(´D´); pdelete.setAccelerator(KeyStroke.getKeyStroke(´D´,java.awt.Event.CTRL_MASK,true)); //////// ///////////// text//////////////////////////////////////// text.setDoubleBuffered(false); text.setToolTipText("杨勇的记事本"); text.setVerifyInputWhenFocusTarget(true); text.setText(""); text.addCaretListener(new Jsb_text_caretAdapter(this)); text.addMouseListener(new Jsb_text_mouseAdapter(this)); text.addAncestorListener(new Jsb_text_ancestorAdapter(this)); ////////////////////////////////////////////////////////// Mbar.add(jFile); Mbar.add(jEdit); Mbar.add(jFormat); Mbar.add(jHelp); jFile.add(jnew); jFile.add(jopen); jFile.addSeparator(); jFile.add(jsave); jFile.add(jsaveas); jFile.addSeparator(); jFile.add(jquite); jEdit.add(jundo); jEdit.addSeparator(); jEdit.add(jcut); jEdit.add(jcopy); jEdit.add(jpaste); jEdit.add(jdelete); jEdit.addSeparator(); jEdit.add(jfind); jEdit.add(jreplace); jEdit.addSeparator(); jEdit.add(jselectall); jEdit.add(jdate); jFormat.add(jword); jFormat.addSeparator(); jFormat.add(jfont); jFormat.addSeparator(); jFormat.add(jcolor); jHelp.add(jabout); pop.add(pundo); pop.addSeparator(); pop.add(pcut); pop.add(pcopy); pop.add(ppaste); pop.add(pdelete); frame.setVisible(true); } /************************************************************ //////////////////////Event///////////////////////////////// **************************************************************/ public void frame_windowclose_windowClosing(WindowListener e){ this.close(); } ///////////////////////////////////////////////////////// public void text_mouseClicked(MouseEvent e){ if(e.getModifiers()==InputEvent.BUTTON3_MASK){ pop.show((Component)e.getSource(),e.getX(),e.getY()); } } public void text_ancestorAdded(AncestorEvent e){ this.dirty=false; this.newtext(); } public void text_caretUpdate(CaretEvent e) { this.dirty=true; //this.statubar.setText(this.text.getText()); } ///////////// File ///////////////////////////////////// public void File_open_actionPerformed(ActionEvent e){ //打开的事件 this.opentext(); } public void File_new_actionPerformed(ActionEvent e){ ///新建的事件 this.newtext(); } public void File_save_actionPerformed(ActionEvent e){ //保存的事件 this.save(); } public void File_saveas_actionPerformed(ActionEvent e){ //另存为 this.saveas(); } public void File_quite_actionPerformed(ActionEvent e){ this.close(); } ////////////////// Edit ///////////////////////////////////// public void Edit_undo_actionPerformed(ActionEvent e){ //撤销 this.undo(); } public void Edit_cut_actionPerformed(ActionEvent e){ //剪切 this.cut(); } public void Edit_copy_actionPerformed(ActionEvent e){ //复制 this.copy(); } public void Edit_paste_actionPerformed(ActionEvent e){ //粘贴 this.paste(); } public void Edit_delete_actionPerformed(ActionEvent e){ //删除 this.delete(); } public void Edit_find_actionPerformed(ActionEvent e){ //查找 int cu=this.text.getCaretPosition(); int end=this.text.getText().length(); FindDlg fd=new FindDlg(frame,"查找",true); fd.show(); String str=fd.getFindStr().trim(); if(fd.getFlag()){ this.nextFindStr(str,cu,end); }else{ this.upFindStr(str,cu); } } public void Edit_replace_actionPerformed(ActionEvent e){ //替换 int cu=this.text.getCaretPosition(); int end=this.text.getText().length(); ReplaceDlg rd=new ReplaceDlg(frame,"替换",true); rd.show(); this.replaceStr(rd.findStr().trim(),rd.replaceStr().trim(),cu,end); } public void Edit_selectall_actionPerformed(ActionEvent e){ //全选 this.text.setSelectionStart(0); this.text.setSelectionEnd(this.text.getText().length()); } public void Edit_timedate_actionPerformed(ActionEvent e){ //时间日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); this.text.append("
|