溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在 Java中構(gòu)建一個文本編輯器

發(fā)布時間:2021-06-12 16:41:53 來源:億速云 閱讀:192 作者:Leah 欄目:編程語言

這篇文章給大家介紹怎么在 Java中構(gòu)建一個文本編輯器,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

工程設(shè)置

通常,我使用并推薦像 Netbeans 或 Eclipse 這樣的 IDE,但我發(fā)現(xiàn),當(dāng)學(xué)習(xí)一種新的語言時,手工做一些工作是很有幫助的,這樣你就能更好地理解使用 IDE 時被隱藏起來的東西。在這篇文章中,我假設(shè)你正在使用文本編輯器和終端進(jìn)行編程。

在開始前,為你自己的工程創(chuàng)建一個工程目錄。在工程文件夾中,創(chuàng)建一個名稱為 src 的目錄來容納你的源文件。

$ mkdir -p myTextEditor/src$ cd myTextEditor

在你的 src 目錄中創(chuàng)建一個名稱為 TextEdit.java 的空白的文件:

$ touch src/TextEditor.java

在你最喜歡的文本編輯器中打開這個空白的文件(我的意思是除你自己編寫之外的最喜歡的一款文本編輯器),然后準(zhǔn)備好編碼吧!

包和導(dǎo)入

為確保你的 Java 應(yīng)用程序有一個唯一的標(biāo)識符,你必須聲明一個 package 名稱。典型的格式是使用一個反向的域名,如果你真的有一個域名的話,這就特別容易了。如果你沒有域名的話,你可以使用 local 作為最頂層。像 Java 和很多語言一樣,行以分號結(jié)尾。

在命名你的 Java 的 package 后,你必須告訴 Java 編譯器(javac)使用哪些庫來構(gòu)建你的代碼。事實上,這通常是你邊編寫代碼邊添加的內(nèi)容,因為你很少事先知道你自己所需要的庫。然而,這里有一些庫是顯而易見的。例如,你知道這個文本編輯器是基于 Swing GUI 工具箱的,因此,導(dǎo)入 javax.swing.JFrame 和javax.swing.UIManager 和其它相關(guān)的特定庫。

package com.example.textedit; import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JTextArea;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;import javax.swing.filechooser.FileSystemView;import java.awt.Component;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.Scanner;import java.util.logging.Level;import java.util.logging.Logger;

對于這個練習(xí)的目標(biāo),你可以提前預(yù)知你所需要的所有的庫。在真實的生活中,不管你喜歡哪一種語言,你都將在研究如何解決一些問題的時候發(fā)現(xiàn)庫,然后,你將它導(dǎo)入到你的代碼中,并使用它。不需要擔(dān)心 —— 如果你忘記包含一個庫,你的編譯器或解釋器將警告你!

主窗口

這是一個單窗口應(yīng)用程序,因此這個應(yīng)用程序的主類是一個 JFrame ,其附帶有一個捕捉菜單事件的 ActionListener 。在 Java 中,當(dāng)你使用一個現(xiàn)有的小部件元素時,你可以使用你的代碼“擴展”它。這個主窗口需要三個字段:窗口本身(一個 JFrame 的實例)、一個用于文件選擇器返回值的標(biāo)識符和文本編輯器本身(JTextArea)。

public final class TextEdit extends JFrame implements ActionListener {private static JTextArea area;private static JFrame frame;private static int returnValue = 0;

令人驚奇的是,這數(shù)行代碼完成了實現(xiàn)一個基本文本編輯器的 80% 的工作,因為 JtextArea 是 Java 的文本輸入字段。剩下的 80 行代碼大部分用于處理輔助功能,比如保存和打開文件。

構(gòu)建一個菜單

JMenuBar 小部件被設(shè)計到 JFrame 的頂部,它為你提供你想要的很多菜單項。Java 不是一種  拖放式的編程語言,因此,對于你所添加的每一個菜單,你都還必須編寫一個函數(shù)。為保持這個工程的可控性,我提供了四個函數(shù):創(chuàng)建一個新的文件,打開一個現(xiàn)有的文件,保存文本到一個文件,和關(guān)閉應(yīng)用程序。

在大多數(shù)流行的工具箱中,創(chuàng)建一個菜單的過程基本相同。首先,你創(chuàng)建菜單條本身,然后創(chuàng)建一個頂級菜單(例如 “File” ),再然后創(chuàng)建子菜單項(例如,“New”、“Save” 等)。

public TextEdit() { run(); } public void run() {    frame = new JFrame("Text Edit");     // Set the look-and-feel (LNF) of the application    // Try to default to whatever the host system prefers    try {      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {      Logger.getLogger(TextEdit.class.getName()).log(Level.SEVERE, null, ex);    }     // Set attributes of the app window    area = new JTextArea();    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    frame.add(area);    frame.setSize(640, 480);    frame.setVisible(true);     // Build the menu    JMenuBar menu_main = new JMenuBar();     JMenu menu_file = new JMenu("File");     JMenuItem menuitem_new = new JMenuItem("New");    JMenuItem menuitem_open = new JMenuItem("Open");    JMenuItem menuitem_save = new JMenuItem("Save");    JMenuItem menuitem_quit = new JMenuItem("Quit");     menuitem_new.addActionListener(this);    menuitem_open.addActionListener(this);    menuitem_save.addActionListener(this);    menuitem_quit.addActionListener(this);     menu_main.add(menu_file);     menu_file.add(menuitem_new);    menu_file.add(menuitem_open);    menu_file.add(menuitem_save);    menu_file.add(menuitem_quit);     frame.setJMenuBar(menu_main);    }

現(xiàn)在,所有剩余的工作是實施菜單項所描述的功能。

編程菜單動作

你的應(yīng)用程序響應(yīng)菜單選擇,是因為你的 JFrame 有一個附屬于它的 ActionListener 。在 Java 中,當(dāng)你實施一個事件處理程序時,你必須“重寫”其內(nèi)建的函數(shù)。這只是聽起來可怕。你不是在重寫 Java;你只是在實現(xiàn)已經(jīng)被定義但尚未實施事件處理程序的函數(shù)。

在這種情況下,你必須重寫 actionPerformed方法。因為在 “File” 菜單中的所有條目都與處理文件有關(guān),所以在我的代碼中很早就定義了一個 JFileChooser 。代碼其它部分被劃分到一個 if 語句的子語句中,這起來像接收到什么事件就相應(yīng)地執(zhí)行什么動作。每個子語句都與其它的子語句完全不同,因為每個項目都標(biāo)示著一些完全唯一的東西。最相似的是 “Open” 和 “Save”,因為它們都使用 JFileChooser 選擇文件系統(tǒng)中的一個位置來獲取或放置數(shù)據(jù)。

“New” 菜單會在沒有警告的情況下清理 JTextArea ,“Quit” 菜單會在沒有警告的情況下關(guān)閉應(yīng)用程序。這兩個 “功能”  都是不安全的,因此你應(yīng)該想對這段代碼進(jìn)行一點改善,這是一個很好的開始。在內(nèi)容還沒有被保存前,一個友好的警告是任何一個好的文本編輯器都必不可少的一個功能,但是在這里為了簡單,這是未來的一個功能。

@Overridepublic void actionPerformed(ActionEvent e) {    String ingest = null;    JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());    jfc.setDialogTitle("Choose destination.");    jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);     String ae = e.getActionCommand();    if (ae.equals("Open")) {        returnValue = jfc.showOpenDialog(null);        if (returnValue == JFileChooser.APPROVE_OPTION) {        File f = new File(jfc.getSelectedFile().getAbsolutePath());        try{            FileReader read = new FileReader(f);            Scanner scan = new Scanner(read);            while(scan.hasNextLine()){                String line = scan.nextLine() + "\n";                ingest = ingest + line;        }            area.setText(ingest);        }    catch ( FileNotFoundException ex) { ex.printStackTrace(); }}    // 保存    } else if (ae.equals("Save")) {        returnValue = jfc.showSaveDialog(null);        try {            File f = new File(jfc.getSelectedFile().getAbsolutePath());            FileWriter out = new FileWriter(f);            out.write(area.getText());            out.close();        } catch (FileNotFoundException ex) {            Component f = null;            JOptionPane.showMessageDialog(f,"File not found.");        } catch (IOException ex) {            Component f = null;            JOptionPane.showMessageDialog(f,"Error.");        }    } else if (ae.equals("New")) {        area.setText("");    } else if (ae.equals("Quit")) { System.exit(0); }  }}

從技術(shù)上來說,這就是這個文本編輯器的全部。當(dāng)然,并沒有真正做什么,除此之外,在這里仍然有測試和打包步驟,因此仍然有很多時間來發(fā)現(xiàn)缺少的必需品。假設(shè)你沒有注意到提示:在這段代碼中 肯定 缺少一些東西。你現(xiàn)在知道缺少的是什么嗎?(在 猜謎游戲文章 中被大量的提到。)

測試

你現(xiàn)在可以測試你的應(yīng)用程序。從終端中啟動你所編寫的文本編輯器:

$ java ./src/TextEdit.javaerror: can’t find main(String[]) method in class: com.example.textedit.TextEdit

它看起來像在代碼中沒有獲得 main 方法。這里有一些方法來修復(fù)這個問題:你可以在 TextEdit.java 中創(chuàng)建一個 main 方法,并讓它運行一個 TextEdit 類實例,或者你可以創(chuàng)建一個單獨的包含 main 方法的文件。兩種方法都可以工作,但從大型工程的預(yù)期來看,使用后者更為明智,因此,使用單獨的文件與其一起工作使之成為一個完整的應(yīng)用程序的方法是值得使用的。

在 src 中創(chuàng)建一個 Main.java 文件,并在最喜歡的編輯器中打開:

package com.example.textedit; public class Main {  public static void main(String[] args) {  TextEdit runner = new TextEdit();  }}

你可以再次嘗試,但是現(xiàn)在有兩個相互依賴的文件要運行,因此你必須編譯代碼。Java 使用 javac 編譯器,并且你可以使用 -d 選項來設(shè)置目標(biāo)目錄:

$ javac src/*java -d .

這會在你的軟件包名稱 com/example/textedit 后創(chuàng)建一個準(zhǔn)確地模型化的新的目錄結(jié)構(gòu)。這個新的類路徑包含文件 Main.class 和 TextEdit.class ,這兩個文件構(gòu)成了你的應(yīng)用程序。你可以使用 java 并通過引用你的 Main 類的位置和 名稱(非文件名稱)來運行它們:

$ java info/slackermedia/textedit/Main`

你的文本編輯器打開了,你可以在其中輸入文字,打開文件,甚至保存你的工作。

怎么在 Java中構(gòu)建一個文本編輯器

帶有單個下拉菜單的白色文本編輯器框,有 File、New、Open、Save 和 Quit 菜單

以 Java 軟件包的形式分享你的工作

雖然一些程序員似乎看起來認(rèn)可以各種各樣的源文件的形式分發(fā)軟件包,并鼓勵其他人來學(xué)習(xí)如何運行它,但是,Java 讓打包應(yīng)用程序變得真地很容易,以至其他人可以很容易的運行它。你已經(jīng)有了必備的大部分結(jié)構(gòu)體,但是你仍然需要一些元數(shù)據(jù)到一個 Manifest.txt 文件中:

$ echo "Manifest-Version: 1.0" > Manifest.txt

用于打包的 jar 命令,與 tar 命令非常相似,因此很多選項對你來說可能會很熟悉。要創(chuàng)建一個 JAR 文件:

$ jar cvfme TextEdit.jarManifest.txtcom.example.textedit.Maincom/example/textedit/*.class

根據(jù)命令的語法,你可以推測出它會創(chuàng)建一個新的名稱為 TextEdit.jar 的 JAR 文件,它所需要的清單數(shù)據(jù)位于 Manifest.txt 中。它的主類被定義為軟件包名稱的一個擴展,并且類自身是 com/example/textedit/Main.class 。

你可以查看 JAR 文件的內(nèi)容:

$ jar tvf TextEdit.jar0 Wed Nov 25 META-INF/105 Wed Nov 25 META-INF/MANIFEST.MF338 Wed Nov 25 com/example/textedit/textedit/Main.class4373 Wed Nov 25 com/example/textedit/textedit/TextEdit.class

如果你想看看你的元數(shù)據(jù)是如何被集成到 MANIFEST.MF 文件中的,你甚至可以使用 xvf 選項來提取它。

使用 java 命令來運行你的 JAR 文件:

$ java -jar TextEdit.jar

關(guān)于怎么在 Java中構(gòu)建一個文本編輯器就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI