用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行
Java做文本編輯器的項(xiàng)目,搜了下看到網(wǎng)上有各種版本的Java文本編輯器有很多種,但有的實(shí)現(xiàn)很麻煩,最近剛好在做這個(gè)實(shí)現(xiàn)就也發(fā)一個(gè),代碼寫得很樸素,注釋無比詳細(xì)。
測試過沒有Bug,如果有什么問題,歡迎探討。代碼供大家借鑒參考,歡迎交流。
用Java實(shí)現(xiàn)文本編輯器:創(chuàng)建,瀏覽、編輯文件;剪貼、復(fù)制、粘貼;保存以及另存為;統(tǒng)計(jì)字符
一、開發(fā)環(huán)境
二、程序模塊功能描述
(一)文件
(二)編輯
(三)統(tǒng)計(jì)
(三)格式:
(四)幫助
三、關(guān)鍵Java API列表
四、運(yùn)行結(jié)果
一、開發(fā)環(huán)境
開發(fā)環(huán)境:Windows 10操作系統(tǒng);JDK 13.0.2
運(yùn)行環(huán)境:JRE 13.0.2?
開發(fā)工具:Notepad++文本編輯器
二、程序模塊功能描述
本項(xiàng)目完成的文本編譯器菜單欄有四個(gè)選項(xiàng):文件、編輯、格式、幫助。
(一)文件
文件下拉菜單包括“新建、打開、保存、另存為、退出”5個(gè)功能。
(二)編輯
編輯下拉菜單包括“剪切、復(fù)制、粘貼”3個(gè)功能。
(三)統(tǒng)計(jì)
??統(tǒng)計(jì)下拉菜單中有“統(tǒng)計(jì)”選項(xiàng)。
(三)格式:
格式下拉菜單有“自動換行”功能。
(四)幫助
幫助菜單下包括“幫助、關(guān)于”兩個(gè)功能。
三、關(guān)鍵Java API列表
java.awt.*; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.io.BufferedReader; java.io.BufferedWriter; java.io.File; java.io.FileReader; java.io.FileWriter; java.io.IOException; javax.swing.*;主框架:
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.*;public class TextFrame extends JFrame{public TextFrame(){super("簡易文本編輯器"); //調(diào)用父類的構(gòu)造方法//創(chuàng)建菜單欄(JMenuBar)對象JMenuBar mBar = new JMenuBar();//在JFrame等容器中設(shè)置菜單欄對象,即將菜單欄添加到框架容器中this.setJMenuBar(mBar);//創(chuàng)建菜單JMenu file = new JMenu("文件");JMenu edit = new JMenu("編輯");JMenu count = new JMenu("統(tǒng)計(jì)");JMenu form = new JMenu("格式");JMenu help = new JMenu("幫助");//將菜單添加到菜單欄中mBar.add(file);mBar.add(edit);mBar.add(count);mBar.add(form);mBar.add(help);JTextArea workArea = new JTextArea(); //創(chuàng)建多行文本框JScrollPane imgScrollPane = new JScrollPane(workArea); //創(chuàng)建一個(gè)空視圖,只要組件內(nèi)容超過視圖大小就會顯示水平和垂直滾動條add(imgScrollPane,BorderLayout.CENTER); //將當(dāng)前類的對象實(shí)例加到frame的中間位置//定義打開和保存對話框 FileDialog openDia;FileDialog saveDia; //默認(rèn)模式為 FileDialog.LOAD openDia = new FileDialog(this,"打開",FileDialog.LOAD); saveDia = new FileDialog(this,"另存為",FileDialog.SAVE); JMenuItem item1_1 = new JMenuItem("新建"); //生成一個(gè)對象item1_1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ //對當(dāng)前的控件添加監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容workArea.setText(""); //清空文本 }});JMenuItem item1_2 = new JMenuItem("打開");item1_2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ //對當(dāng)前的控件添加監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容openDia.setVisible(true); //打開文件對話框String dirPath = openDia.getDirectory(); //獲取打開文件路徑并保存 String fileName = openDia.getFile(); //獲取文件名稱并保存 //判斷打開路徑或目錄是否為空,則返回空 if(dirPath == null || fileName == null){return ;} workArea.setText("");//清空文本File fileO = new File(dirPath,fileName); try{BufferedReader bufr = new BufferedReader(new FileReader(fileO)); //嘗試從文件中讀取內(nèi)容String line = null; //變量字符串初始化為空 while((line = bufr.readLine()) != null){workArea.append(line + "\r\n"); //顯示每行內(nèi)容}bufr.close(); //關(guān)閉文本} catch(IOException er1){throw new RuntimeException("文件讀取失敗!"); }}});JMenuItem item1_3 = new JMenuItem("保存");item1_3.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容File fileS = null;if(fileS == null){saveDia.setVisible(true); //顯示保存文件對話框String dirPath = saveDia.getDirectory(); //獲取保存文件路徑并保存到字符串中String fileName = saveDia.getFile(); //獲取保存文件名稱并保存到字符串中if(dirPath == null || fileName == null) //判斷路徑和文件是否為空return; //返回空值fileS = new File(dirPath,fileName); //文件不為空,新建一個(gè)路徑和名稱}try{BufferedWriter bufw = new BufferedWriter(new FileWriter(fileS)); //嘗試從文件中讀取內(nèi)容String text = workArea.getText(); //獲取文本內(nèi)容bufw.write(text); //將獲取文本內(nèi)容寫入到字符輸出流bufw.close(); //關(guān)閉文件}catch(IOException er){throw new RuntimeException("文件保存失敗!"); }}});JMenuItem item1_4 = new JMenuItem("另存為");item1_4.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容File fileS = null;if(fileS == null){saveDia.setVisible(true); //顯示另存為文件對話框String dirPath = saveDia.getDirectory(); //獲取保存文件路徑并保存到字符串中String fileName = saveDia.getFile(); //獲取保存文件名稱并保存到字符串中 if(dirPath == null || fileName == null) //判斷路徑和文件是否為空return ; //返回空值fileS = new File(dirPath,fileName); //文件不為空,新建一個(gè)路徑和名稱}try{BufferedWriter bufw = new BufferedWriter(new FileWriter(fileS)); //嘗試從文件中讀取內(nèi)容String text = workArea.getText(); //獲取文本內(nèi)容bufw.write(text); //將獲取文本內(nèi)容寫入到字符輸出流bufw.close(); //關(guān)閉文件} catch(IOException er){throw new RuntimeException("文件保存失敗!"); }}});JMenuItem item1_5 = new JMenuItem("退出");item1_5.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容System.exit(0);}});//創(chuàng)建菜單項(xiàng)JMenuItem item2_1 = new JMenuItem("剪切");item2_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){workArea.cut();}});JMenuItem item2_2 = new JMenuItem("復(fù)制");item2_2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){workArea.copy();}});JMenuItem item2_3 = new JMenuItem("粘貼");item2_3.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){workArea.paste();}}); JMenuItem item2_4 = new JMenuItem("統(tǒng)計(jì)");item2_4.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容//try代碼塊,當(dāng)發(fā)生異常時(shí)會轉(zhuǎn)到catch代碼塊中String a = workArea.getText();//定義字符串變量,并賦值為用戶輸入的信息//創(chuàng)建類進(jìn)行文件的讀取,并指定編碼格式為utf-8//char[] ch = a.toCharArray();//把字符串變成char數(shù)組int c = 0,h = 0,ll = 0,l = 0,n = 0,o = 0,sum = 0;//定義整型變量,用于統(tǒng)計(jì)字符數(shù)for(int i = 0;i<a.length();i++){String s = a.substring(i,i+1);if (s.matches("[\\u4e00-\\u9fa5]")) {//if語句的條件,判斷是否為漢字h++;//若為漢字則c1自增} else if(s.matches("[A-Z]")){//if語句的條件,判斷是否為大寫字母ll++;//若為大寫字母則c2自增} else if(s.matches("[a-z]")){//if語句的條件,判斷是否為小寫字母l++;//若為小寫字母則c3自增} else if(s.matches("[0-9]")){//if語句的條件,判斷是否為數(shù)字n++;//若為數(shù)字則c4自增} else {//否則可判斷為其他字符o++;//若為其他字符則c5自增}}sum = h + ll + l + n + o ;//統(tǒng)計(jì)總字符數(shù)JOptionPane.showMessageDialog(TextFrame.this, "字?jǐn)?shù)統(tǒng)計(jì):\n漢字:"+h+"\n大寫字母:"+ll+"\n小寫字母:"+l+"\n數(shù)字:"+n+"\n其他字符:"+o+"\n共計(jì)"+sum);}});JRadioButtonMenuItem item3_1 = new JRadioButtonMenuItem("自動換行",false);item3_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容Object source = e.getSource();if(source == item3_1)workArea.setLineWrap(true); //自動換行else if(source != item3_1)workArea.setLineWrap(false);}});JMenuItem item4_1 = new JMenuItem("幫助");item4_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容new Help();}});JMenuItem item4_2 = new JMenuItem("關(guān)于");item4_2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){ //對當(dāng)前的控件添加一個(gè)監(jiān)聽器,點(diǎn)擊控件時(shí)就會觸發(fā)監(jiān)聽函數(shù)里面的內(nèi)容new About ();}});//在菜單中添加菜單項(xiàng)file.add(item1_1);file.add(item1_2);file.add(item1_3);file.add(item1_4);file.add(item1_5);edit.add(item2_1);edit.add(item2_2);edit.add(item2_3);form.add(item3_1);help.add(item4_1);help.add(item4_2);}//構(gòu)造方法結(jié)束 public static void main(String args[]){TextFrame app = new TextFrame();app.setSize(600, 400); //設(shè)置窗口大小,寬度600,高度400app.setLocation(200,200); //設(shè)置窗口位置為距離屏幕左邊水平方向200,上方垂直方向200app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //點(diǎn)擊關(guān)閉按鈕是直接退出app.setVisible(true); //設(shè)置窗體可見} }幫助:
import javax.swing.*; import java.awt.*;public class Help extends JFrame{public Help(){super("幫助"); //調(diào)用父類的構(gòu)造方法this.setSize(500, 150); //設(shè)置窗口大小,寬度500,高度150this.setLocation(250,300); //設(shè)置窗口位置為距離屏幕左邊水平方向250,上方垂直方向300this.setResizable(false); //設(shè)置窗體大小不可改變this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); //點(diǎn)擊關(guān)閉按鈕是直接退出this.setVisible(true); //設(shè)置窗體可見Container c = this.getContentPane(); //初始化一個(gè)容器c.setLayout(new GridLayout(3,0)); //將窗口布局設(shè)置為網(wǎng)格式布局,網(wǎng)格的行數(shù)和列數(shù)分別是3和0//創(chuàng)建標(biāo)簽文字JLabel label1 = new JLabel("1、“菜單”中的功能“新建”、“打開”、“保存”、“另存為”、“退出”通過點(diǎn)擊對應(yīng)使用。");JLabel label2 = new JLabel("2、“編輯”中的“剪切”“復(fù)制”“粘貼”可對應(yīng)使用快捷鍵Ctrl + X、Ctrl + C、Ctrl +V。");JLabel label3 = new JLabel("3、“格式”里的“自動換行”勾選后到窗口邊緣自動換行;不勾選則向后繼續(xù)寫入。");c.add(label1);c.add(label2);c.add(label3); //添加標(biāo)簽到容器中} }關(guān)于:
import javax.swing.*;public class About extends JFrame{public About(){super("關(guān)于"); //調(diào)用父類的構(gòu)造方法this.setSize(280, 100); //設(shè)置窗口大小,寬度280,高度100this.setLocation(250,300); //設(shè)置窗口位置為距離屏幕左邊水平方向250,上方垂直方向300this.setResizable(false); //設(shè)置窗體大小不可改變this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); //點(diǎn)擊關(guān)閉按鈕直接退出this.setVisible(true); //設(shè)置窗體可見JPanel panel = new JPanel(); //使用默認(rèn)的浮動布局JLabel label1 = new JLabel("這是一個(gè)用Java開發(fā)的簡易文本編譯器。"); JLabel label2 = new JLabel("Copyright ?2020 馬桂雨");panel.add(label1);panel.add(label2);this.add(panel);} }四、運(yùn)行結(jié)果
- 編輯器界面
- 打開文件
- 保存文件
- 自動換行
- 統(tǒng)計(jì)
- 幫助
- 關(guān)于
總結(jié)
以上是生活随笔為你收集整理的用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql99标准
- 下一篇: swift moya框架+rxswift