diff --git a/nullnull b/nullnull new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/WENBEN/MainTextEditor.java b/src/WENBEN/MainTextEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..c36c8e2bf6d3bd369a38c6c9a9a688550357d335 --- /dev/null +++ b/src/WENBEN/MainTextEditor.java @@ -0,0 +1,6 @@ +package WENBEN; +public class MainTextEditor { +public static void main(String args[]) { + new TextEditor(); +} +} diff --git a/src/WENBEN/TextEditor.java b/src/WENBEN/TextEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..91870080de92b80ba68754ceb1ac443f7101b629 --- /dev/null +++ b/src/WENBEN/TextEditor.java @@ -0,0 +1,420 @@ +package WENBEN; +import javax.swing.*; +import java.awt.event.*; +import java.io.*; +import java.awt.*; +import javax.swing.undo.*; +import javax.swing.event.DocumentListener; +import javax.swing.event.UndoableEditEvent; +import javax.swing.event.UndoableEditListener; +public class TextEditor extends JFrame implements ActionListener,MouseListener{ + JTextArea area;//文本编辑区 + JLabel statusLabel;//状态栏标签 + String tempString; + String fileName=""; + + JPopupMenu youjian;//右键弹出快捷键菜单 + //右键弹出快捷菜单的菜单项 + JMenuItem che=new JMenuItem("撤销(U)"); + JMenuItem jian=new JMenuItem("剪切(T)"); + JMenuItem fu=new JMenuItem("复制(C)"); + JMenuItem zhan=new JMenuItem("粘贴(P)"); + JMenuItem shan=new JMenuItem("删除(D)"); + JMenuItem quan=new JMenuItem("全选(A)"); + + JMenuBar menubar; //菜单条 + JMenu wenjian,bianji,geshi,chakan,bangzhu;//菜单 + //菜单项 + JMenuItem xinjian=new JMenuItem("新建(N)"); + JMenuItem dakai=new JMenuItem("打开(O)..."); + JMenuItem baocun=new JMenuItem("保存(S)"); + JMenuItem lingcunwei=new JMenuItem("另存为(A)..."); + JMenuItem tuichu=new JMenuItem("退出(X)"); + JMenuItem chexiao=new JMenuItem("撤销(U)"); + JMenuItem jianqie=new JMenuItem("剪切(T)"); + JMenuItem fuzhi=new JMenuItem("复制(C)"); + JMenuItem zhantie=new JMenuItem("粘贴(P)"); + JMenuItem shanchu=new JMenuItem("删除(L)"); + JCheckBoxMenuItem huanhang=new JCheckBoxMenuItem("自动换行(W)"); + JCheckBoxMenuItem zhuangtai=new JCheckBoxMenuItem("状态栏(S)"); + JMenuItem ckbz=new JMenuItem("查看帮助(H)"); + JMenuItem guanyu=new JMenuItem("关于记事本(A)"); + + //构造空文件 + public TextEditor() { + init(); + setLocation(100,100); + setSize(650,550); + setVisible(true); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + //构造制定文件名的文件 + public TextEditor(String filename) { + init(); + setLocation(100,100); + setSize(650,550); + setVisible(true); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + } + //布局页面 + void init() { + setTitle("记事本 "); + menubar=new JMenuBar(); + setJMenuBar(menubar);//将菜单条放置到窗口 + + //菜单:文件 + wenjian=new JMenu("文件(F)"); + menubar.add(wenjian);//将菜单放置到菜单条中 + wenjian.add(xinjian); + wenjian.add(dakai); + wenjian.add(baocun); + wenjian.add(lingcunwei); + wenjian.add(tuichu);//将菜单项放置到菜单中 + xinjian.addActionListener(this); + dakai.addActionListener(this); + baocun.addActionListener(this); + lingcunwei.addActionListener(this); + tuichu.addActionListener(this);//菜单项添加监视器 + xinjian.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK)); + dakai.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK)); + baocun.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK)); + lingcunwei.setAccelerator(KeyStroke.getKeyStroke('A')); + tuichu.setAccelerator(KeyStroke.getKeyStroke('X'));//设置快捷键 + + //菜单:编辑 + bianji=new JMenu("编辑(E)"); + menubar.add(bianji);//将菜单放置到菜单条中 + bianji.add(chexiao); + bianji.add(jianqie); + bianji.add(fuzhi); + bianji.add(zhantie); + bianji.add(shanchu);//将菜单项放置到菜单中 + chexiao.addActionListener(this); + jianqie.addActionListener(this); + fuzhi.addActionListener(this); + zhantie.addActionListener(this); + shanchu.addActionListener(this);//菜单项添加监视器 + chexiao.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,ActionEvent.CTRL_MASK)); + jianqie.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK)); + fuzhi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK)); + zhantie.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK));//设置快捷键 + + //菜单:格式 + geshi=new JMenu("格式(O)"); + menubar.add(geshi);//将菜单放置到菜单条中 + geshi.add(huanhang);//将菜单项放置到菜单中 + huanhang.addActionListener(this);//菜单项添加监视器 + + //菜单:查看 + chakan=new JMenu("查看(V)"); + menubar.add(chakan);//将菜单放置到菜单条中 + chakan.add(zhuangtai);//将菜单项放置到菜单中 + zhuangtai.addActionListener(this);//菜单项添加监视器 + zhuangtai.setState(true); + + //菜单:帮助 + bangzhu=new JMenu("帮助(H)"); + menubar.add(bangzhu);//将菜单放置到菜单条中 + bangzhu.add(ckbz); + bangzhu.add(guanyu);//将菜单项放置到菜单中 + ckbz.addActionListener(this); + guanyu.addActionListener(this);//菜单项添加监视器 + + //创建文本编辑区和添加滚动条 + area=new JTextArea(20,50); + JScrollPane scroller=new JScrollPane(area); + add(scroller,BorderLayout.CENTER);//添加 + area.addMouseListener(this);//文本编辑区添加监视器 + + //右键弹出快捷键菜单 + youjian=new JPopupMenu(); + youjian.add(che); + youjian.add(jian); + youjian.add(fu); + youjian.add(zhan); + youjian.add(shan); + youjian.add(quan);//将菜单项放置到菜单中 + youjian.addSeparator();//弹出式菜单加上分隔线 + che.addActionListener(this); + jian.addActionListener(this); + fu.addActionListener(this); + zhan.addActionListener(this); + shan.addActionListener(this); + quan.addActionListener(this);//右键菜单项添加监视器 + + //注册右键弹出快捷键事件 + area.addMouseListener(new MouseAdapter() + {public void mousePressed(MouseEvent e) { + if(e.isPopupTrigger()){ + youjian.show(e.getComponent(),e.getX(),e.getY()); + } + checkEnabled(); + area.requestFocus(); + } + public void mouseReleased(MouseEvent e) { + if(e.isPopupTrigger()){ + youjian.show(e.getComponent(),e.getX(),e.getY()); + } + checkEnabled(); + area.requestFocus(); + } + }); + } + + + //判定剪切、复制、删除是否可用(是否选择内容) + public void checkEnabled() { + String selectText=area.getSelectedText(); + if(selectText==null) + {jianqie.setEnabled(false); + jian.setEnabled(false); + fuzhi.setEnabled(false); + fu.setEnabled(false); + shanchu.setEnabled(false); + shan.setEnabled(false); + } + else + {jianqie.setEnabled(true); + jian.setEnabled(true); + fuzhi.setEnabled(true); + fu.setEnabled(true); + shanchu.setEnabled(true); + shan.setEnabled(true); + } + } + //重写方法 + public void mouseClicked(MouseEvent me1) {} + public void mousePressed(MouseEvent me2) {} + public void mouseReleased(MouseEvent me3) {} + public void mouseEntered(MouseEvent me4) {} + public void mouseExited(MouseEvent me5) {} + + //设置事件发生 + public void actionPerformed(ActionEvent e) { + //新建 + if(e.getSource()==xinjian) { + area.requestFocus(); + area.replaceRange("", 0, area.getText().length()); + fileName=""; + } + //打开 + else if(e.getSource()==dakai) { + area.requestFocus(); + String fileName=null; + FileDialog df=new FileDialog(this,"打开文件",FileDialog.LOAD); + df.setVisible(true); + File f=new File(df.getDirectory()+df.getFile()); + fileName=df.getDirectory()+df.getFile(); + char ch[]=new char[(int)f.length()]; + try + { + BufferedReader bw=new BufferedReader(new FileReader(f)); + bw.read(ch); + bw.close(); + } + catch(FileNotFoundException fe) { + System.out.println("文件不存在"); + System.exit(0); + } + catch(IOException ie){ + System.out.println("文件异常"); + System.exit(0); + } + String s=new String(ch); + area.setText(s); + } + //保存 + else if(e.getSource()==baocun) { + boolean isNewFile=true;//判断是否保存过 + if(isNewFile) { //未保存过 + FileDialog fd = new FileDialog(this, "保存", FileDialog.SAVE); + fd.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent ee) { + System.exit(0); + } + }); + fd.setVisible(true); + String s=area.getText(); + try + { + File f=new File(fd.getDirectory()+fd.getFile()); + BufferedWriter bw=new BufferedWriter(new FileWriter(f)); + bw.write(s,0,s.length()); + bw.close(); + } + catch(FileNotFoundException fe1) { //若文件不存在,抛出FileNotFoundException异常 + System.out.println("文件不存在"); + System.exit(0); + } + catch(IOException ie1) + { + System.out.println("文件异常"); + System.exit(0); + } + } + else { //保存过 + String s=area.getText(); + try + { String fileName=null; + File f=new File(fileName); + BufferedWriter bw=new BufferedWriter(new FileWriter(f)); + bw.write(s,0,s.length()); + bw.close(); + } + catch(FileNotFoundException fe1) { //若文件不存在,抛出FileNotFoundException异常 + System.out.println("文件不存在"); + System.exit(0); + } + catch(IOException ie1) + { + System.out.println("文件异常"); + System.exit(0); + } + } + } + //另存为 + else if(e.getSource()==lingcunwei) { + area.requestFocus(); + FileDialog fd = new FileDialog(this, "另存为", FileDialog.SAVE); + /*创建具有指定标题的文件对话框窗口(FileDialog)。 + * FileDialog(Dialog parent, String title, int mode) + parent - 对话框的所有者 + title - 对话框的标题 + mode - 对话框的模式,FileDialog.LOAD(打开) 或 FileDialog.SAVE(保存) + */ + fd.addWindowListener(new WindowAdapter() + {public void windowClosing (WindowEvent eee) { + System.exit(0); + } + }); + fd.setVisible(true); + String s=area.getText(); + try + { + File f=new File(fd.getDirectory()+fd.getFile()); + BufferedWriter bw=new BufferedWriter(new FileWriter(f)); + bw.write(s,0,s.length()); + bw.close(); + } + catch(FileNotFoundException fe2) { //若文件不存在,抛出FileNotFoundException异常 + System.out.println("文件不存在"); + System.exit(0); + } + catch(IOException ie2) + { + System.out.println("文件异常"); + System.exit(0); + } + } + + + //退出 + else if(e.getSource()==tuichu) { + int exitChoose=JOptionPane.showConfirmDialog(this,"确定要退出吗?","退出提示",JOptionPane.OK_CANCEL_OPTION); + if(exitChoose==JOptionPane.OK_OPTION) { + System.exit(0); } + else { return; } + } + //撤销 + else if(e.getSource()==chexiao||e.getSource()==che) { + area.requestFocus(); + UndoManager undo= new UndoManager(); + if(undo.canUndo()) + { try + { undo.undo(); + } + catch (CannotUndoException ex) + { System.out.println("无法撤销" + ex); + //ex.printStackTrace(); + } + } + if(!undo.canUndo()) + { chexiao.setEnabled(false); + che.setEnabled(false); + } + } + //剪切 + else if(e.getSource()==jianqie||e.getSource()==jian) { + area.requestFocus();//设置焦点 + tempString=area.getSelectedText();//获取文本框中的文本 + StringBuffer temp=new StringBuffer(area.getText());//StringBuffer是字符串变量,它的对象是可以扩充和修改的。 + int start=area.getSelectionStart(); + int len=area.getSelectedText().length(); + temp.delete(start,start+len); + /** + *删除选定内容StringBuffer delete(int start, int end) + *删除当前StringBuffer对象中以索引号start开始,到end结束的子串 + */ + area.setText(temp.toString());//setText(String text),在文本框中设置文本 + checkEnabled(); + } + //复制 + else if(e.getSource()==fuzhi||e.getSource()==fu){ + area.requestFocus(); + tempString=area.getSelectedText(); + checkEnabled(); + } + //粘贴 + else if(e.getSource()==zhantie||e.getSource()==zhan) { + int start=area.getSelectionStart(); + StringBuffer temp=new StringBuffer(area.getText()); + temp.insert(start, tempString); + /** + * StringBuffer insert(int offset, char c) + * 在当前StringBuffer对象中插入一个元素,在索引号offset处插入相应的值。 + */ + area.setText(temp.toString()); + checkEnabled(); + } + //删除 + else if(e.getSource()==shanchu||e.getSource()==shan) { + StringBuffer temp=new StringBuffer(area.getText());//StringBuffer是字符串变量,它的对象是可以扩充和修改的。 + int start=area.getSelectionStart(); + int len=area.getSelectedText().length(); + temp.delete(start,start+len); + area.setText(temp.toString()); + checkEnabled(); + } + //全选 + else if(e.getSource()==quan) { + area.selectAll(); + } + //自动换行 + else if(e.getSource()==huanhang) { + if(huanhang.getState()) + area.setLineWrap(true); + else + area.setLineWrap(false); + } + //状态栏 + else if(e.getSource()==zhuangtai) { + if(zhuangtai.getState()) { + statusLabel.setVisible(true);} + else { + statusLabel.setVisible(false); + statusLabel=new JLabel("按F1获取帮助"); + this.add(statusLabel,BorderLayout.SOUTH); + } + } + //查看帮助 + else if(e.getSource()==ckbz) { + TextEditor h=new TextEditor("帮助文档.txt"); + h.setSize(400,500); + } + //关于记事本功能 + else if(e.getSource()==guanyu) { + JDialog dialog1; + JLabel label1; + dialog1=new JDialog(this,"关于记事本"); + dialog1.setSize(480,150); + label1=new JLabel("",JLabel.CENTER); + dialog1.add(label1); + dialog1.setDefaultCloseOperation(HIDE_ON_CLOSE); + dialog1.setLocation(250,330); + dialog1.setVisible(true); + } + } + +} + +