diff --git a/src/java2020spring/About.java b/src/java2020spring/About.java new file mode 100644 index 0000000000000000000000000000000000000000..d7e3516abcfa12fd62de52f933e3d587308d5a6f --- /dev/null +++ b/src/java2020spring/About.java @@ -0,0 +1,21 @@ +package java2020spring; +import java.awt.Container; +import java.awt.GridLayout; + +import javax.swing.*; +public class About extends JFrame{ +public About() { + super("关于记事本"); + this.setSize(300,170); + this.setLocation(250,300); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setVisible(true); + Container b=this.getContentPane(); + b.setLayout(new GridLayout(2,0)); + JLabel label1=new JLabel(" 这是一个用Java开发的文本编辑器 "); + JLabel label2=new JLabel(" Copyright @2021 戴嘉如") ; + b.add(label1); + b.add(label2); + +} +} diff --git a/src/java2020spring/AreaListener.java b/src/java2020spring/AreaListener.java new file mode 100644 index 0000000000000000000000000000000000000000..c84a18f3a0d7945390ef010721f817b7aa917395 --- /dev/null +++ b/src/java2020spring/AreaListener.java @@ -0,0 +1,45 @@ +package java2020spring; + +import java.awt.BorderLayout; +import java.awt.GridLayout; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.BadLocationException; + + + public class AreaListener implements CaretListener{ + JTextArea area =new JTextArea(); + JLabel label1,label2,label3; + public void setarea(JTextArea text) { + area=text; + } + public void setlabel(JLabel la1,JLabel la2,JLabel la3) { + label1=la1; + label2=la2; + label3=la3; + } + public void caretUpdate(CaretEvent e) { + + int c=area.getCaretPosition(); + int line=0,co1=0; + try { + + line = area.getLineOfOffset(c)+1; + co1=c-area.getLineStartOffset(line-1); + } + catch (BadLocationException e1) { + e1.printStackTrace(); + } + + label1.setText("第"+line+"行"); + label2.setText("第"+co1+"列"); + label3.setText("字数:"+number.getnumber(area.getText())); + + } + } diff --git a/src/java2020spring/Help.java b/src/java2020spring/Help.java new file mode 100644 index 0000000000000000000000000000000000000000..0ff8f8c278f41acfa923fb468a1386f9018cc1d9 --- /dev/null +++ b/src/java2020spring/Help.java @@ -0,0 +1,27 @@ +package java2020spring; +import javax.swing.*; +import java.awt.*; + +public class Help extends JFrame{ + public Help() { + super("帮助"); + this.setSize(500,170); + this.setLocation(250,300); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setVisible(true); + Container a=this.getContentPane(); + a.setLayout(new GridLayout(5,0)); + JLabel label1=new JLabel(" 1、可通过点击“文件”中的菜单项打开或保存相应文件。"); + JLabel label2=new JLabel(" 2、可通过点击“编辑”中的菜单项对文本区域的文本进行相应操作"); + JLabel label3=new JLabel(" 3、可通过勾选或者取消勾选“格式”中的“自动换行”,来打开或关闭自动换行功能"); + JLabel label4=new JLabel(" 4、可通过勾选或者取消勾线“查看”中的“状态栏”,来打开或者关闭编辑器底部的状态栏,"); + JLabel label5=new JLabel(" 状态栏中分别显示光标所处的行、列情况和文本字数"); + a.add(label1); + a.add(label2); + a.add(label3); + a.add(label4); + a.add(label5); + + + } +} diff --git a/src/java2020spring/Test.java b/src/java2020spring/Test.java index fc09c195f566d0e707f5e8a2f05fd168069c73a7..ff8b4fcab15644d90373295676fe4370ff9886c8 100644 --- a/src/java2020spring/Test.java +++ b/src/java2020spring/Test.java @@ -1,10 +1,347 @@ package java2020spring; +import java.awt.*; +import java.io.*; +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.BadLocationException; +import javax.swing.undo.*; +import java.awt.event.*; -public class Test { +public class Test extends JFrame { + Test() + { + super("文本编辑器"); + JMenuBar menubar =new JMenuBar(); + JMenu menu1,menu2,menu3,menu4,menu5; + JMenuItem item11,item12,item13,item14,item15,item21,item22,item23,item24,item25, + item26,item51,item52,item221,item222,item223,item224,item225,item226; + this.setJMenuBar(menubar); + menu1=new JMenu("文件"); + menu2=new JMenu("编辑"); + menu3=new JMenu("格式"); + menu4=new JMenu("查看"); + menu5=new JMenu("帮助"); + + item11=new JMenuItem("新建(N)",KeyEvent.VK_N); + item11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK)); + item12=new JMenuItem("打开(O)",KeyEvent.VK_O); + item12.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK)); + item13=new JMenuItem("保存(S)",KeyEvent.VK_S); + item13.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK)); + item14=new JMenuItem("另存为(A)",KeyEvent.VK_A); + item14.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,ActionEvent.CTRL_MASK)); + item15=new JMenuItem("退出(X)",KeyEvent.VK_X); + item21=new JMenuItem("撤销(U)",KeyEvent.VK_Z); + item21.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,ActionEvent.CTRL_MASK)); + item22=new JMenuItem("剪切(T)",KeyEvent.VK_X); + item22.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK)); + item23=new JMenuItem("复制(C)",KeyEvent.VK_C); + item23.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK)); + item24=new JMenuItem("粘贴(P)",KeyEvent.VK_V); + item24.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK)); + item25=new JMenuItem("删除(L)",KeyEvent.VK_DELETE); + item26=new JMenuItem("恢复(R)",KeyEvent.VK_Q); + item26.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.CTRL_MASK)); + JCheckBoxMenuItem item31 = new JCheckBoxMenuItem("自动换行(W)"); + JCheckBoxMenuItem item41 = new JCheckBoxMenuItem("状态栏"); + item51=new JMenuItem("查看帮助(H)"); + item52=new JMenuItem("关于记事本(A)"); + item221=new JMenuItem("撤销(U)",KeyEvent.VK_Z); + item221.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,ActionEvent.CTRL_MASK)); + item222=new JMenuItem("剪切(T)",KeyEvent.VK_X); + item222.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK)); + item223=new JMenuItem("复制(C)",KeyEvent.VK_C); + item223.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK)); + item224=new JMenuItem("粘贴(P)",KeyEvent.VK_V); + item224.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK)); + item225=new JMenuItem("删除(L)",KeyEvent.VK_DELETE); + item226=new JMenuItem("恢复(R)",KeyEvent.VK_Q); + item226.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.CTRL_MASK)); + menu1.add(item11); + menu1.add(item12); + menu1.add(item13); + menu1.add(item14); + menu1.addSeparator(); + menu1.add(item15); + menu2.add(item221); + menu2.add(item226); + menu2.addSeparator(); + menu2.add(item222); + menu2.add(item223); + menu2.add(item224); + menu2.add(item225); + menu3.add(item31); + menu4.add(item41); + menu5.add(item51); + menu5.add(item52); + menubar.add(menu1); + menubar.add(menu2); + menubar.add(menu3); + menubar.add(menu4); + menubar.add(menu5); + + JTextArea workArea=new JTextArea(); + JScrollPane pane =new JScrollPane(workArea); + add(pane,BorderLayout.CENTER); + + FileDialog open =new FileDialog(this,"打开",FileDialog.LOAD); + FileDialog save=new FileDialog(this,"另存为",FileDialog.SAVE); + item11.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + workArea.setText(""); + } + }); + item12.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + open.setVisible(true); + String dirPath=open.getDirectory(); + String fileName=open.getFile(); + if(dirPath==null||fileName==null) { + return; + } + workArea.setText(""); + File file0=new File(dirPath,fileName); + try { + BufferedReader buff=new BufferedReader(new FileReader(file0)); + String str=null; + while((str=buff.readLine())!=null) { + workArea.append(str+"\r\n"); + } + buff.close(); + } + catch(IOException e1) { + throw new RuntimeException("文件读取失败!"); + }} + }); + item13.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + File file1=null; + if(file1==null) { + save.setVisible(true); + String dirPath=save.getDirectory(); + String fileName=save.getFile(); + if(dirPath==null||fileName==null) + return; + file1=new File(dirPath,fileName); + try { + BufferedWriter buff=new BufferedWriter(new FileWriter(file1)); + String text=workArea.getText(); + buff.write(text); + buff.close(); + } + catch(IOException e1) { + throw new RuntimeException("文件保存失败!"); + } + } + } + }); + item14.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + File file2=null; + if(file2==null) { + save.setVisible(true); + String dirPath=save.getDirectory(); + String fileName=save.getFile(); + if(dirPath==null||fileName==null) + return; + file2=new File(dirPath,fileName); + try { + BufferedWriter buff=new BufferedWriter(new FileWriter(file2)); + String text=workArea.getText(); + buff.write(text); + buff.close(); + } + catch(IOException e1) { + throw new RuntimeException("文件另存为失败!"); + } + } + } + }); + item15.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + item22.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.cut(); + } + }); + item23.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.copy(); + } + }); + item24.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.paste(); + } + }); + + + UndoManager undoandreco=new UndoManager(); + workArea.getDocument().addUndoableEditListener(undoandreco); + item21.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + if(undoandreco.canUndo()) + undoandreco.undo(); + else { + JOptionPane.showMessageDialog(null, "无法撤销","警告",JOptionPane.WARNING_MESSAGE); + } + }}); + - public static void main(String[] args) { - System.out.println("Hello world!"); + workArea.getDocument().addUndoableEditListener(undoandreco); + item26.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + if(undoandreco.canRedo()) + undoandreco.redo(); + else { + JOptionPane.showMessageDialog(null, "无法恢复","警告",JOptionPane.WARNING_MESSAGE); + } + }}); + + item25.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.setText(""); + } + }); + + + + + item222.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.cut(); + } + }); + item223.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.copy(); + } + }); + item224.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.paste(); + } + }); + + workArea.getDocument().addUndoableEditListener(undoandreco); + item221.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + if(undoandreco.canUndo()) + undoandreco.undo(); + else { + JOptionPane.showMessageDialog(null, "无法撤销","警告",JOptionPane.WARNING_MESSAGE); + } + }}); + + workArea.getDocument().addUndoableEditListener(undoandreco); + item226.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + if(undoandreco.canRedo()) + undoandreco.redo(); + else { + JOptionPane.showMessageDialog(null, "无法恢复","警告",JOptionPane.WARNING_MESSAGE); + } + }}); + + item225.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + workArea.setText(""); + } + }); + + + + item31.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + if(item31.getState()==true) + workArea.setLineWrap(true); + else + workArea.setLineWrap(false); + } + }); + + AreaListener areaListener=new AreaListener(); + JPanel pane2=new JPanel(); + pane2.setLayout(new GridLayout(1,5)); + JLabel label1=new JLabel("第1行"); + JLabel label2=new JLabel("第1列"); + JLabel label3=new JLabel("字数:0"); + pane2.add(label1); + pane2.add(label2); + pane2.add(label3); + add(pane2,BorderLayout.SOUTH); + areaListener.setlabel(label1, label2, label3); + areaListener.setarea(workArea); + workArea.addCaretListener(areaListener); + item41.setState(true); + item41.addActionListener(new ActionListener () { + public void actionPerformed(ActionEvent e) { + if(item41.getState()==true) + pane2.setVisible(true); + else if(item41.getState()==false) + pane2.setVisible(false); + } + }); + item51.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new Help(); + } + }); + item52.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new About(); + } + }); + + JPopupMenu pop=new JPopupMenu(); + pop.add(item21); + pop.add(item26); + pop.addSeparator(); + pop.add(item22); + pop.add(item23); + pop.add(item24); + pop.add(item25); + workArea.addMouseListener(new mouselistener(pop)); + + + } + + + +public static void main(String arg[]) { + Test test=new Test(); + test.setBounds(200,200,600,400); + test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + test.setVisible(true); + +}} + +class mouselistener implements MouseListener{ + JPopupMenu pop2; + mouselistener(JPopupMenu pop1){ + pop2=pop1; + } + public void display(MouseEvent e) { + if(e.isPopupTrigger()) + pop2.show(e.getComponent(),e.getX(),e.getY()); + } + public void mouseReleased(MouseEvent e) { + this.display(e); + } +public void mouseEntered(MouseEvent e) {} + +public void mouseClicked(MouseEvent e) {} + +public void mousePressed(MouseEvent e) {} + +public void mouseExited(MouseEvent e) {} } + + diff --git a/src/java2020spring/number.java b/src/java2020spring/number.java new file mode 100644 index 0000000000000000000000000000000000000000..a2947fe4d1fd9e08f61994691b399fa1ff45d26d --- /dev/null +++ b/src/java2020spring/number.java @@ -0,0 +1,14 @@ +package java2020spring; + +public class number { + public static int getnumber(String str) { + String dest=""; + if(str!=null) { + str=str.replaceAll("[\\pP‘’“”]", ""); + dest=str.replaceAll("\\s*|\t|\r|\n",""); + } + return dest.length(); + } +} + +