当前位置: 首页 > 科技观察

用Java构建您自己的文本编辑器

时间:2023-03-20 17:19:05 科技观察

有时,除了您自己,没有人可以制作您梦寐以求的工具。以下是开始构建您自己的文本编辑器的方法。有很多文本编辑器。有在终端运行的,有在GUI运行的,有在浏览器运行的,还有浏览器引擎。很多还不错,还有一些非常好。但有时,毫无疑问,最令人满意的是您自己构建的编辑器。别搞错了:构建一个真正优秀的文本编辑器比看起来要难得多。但话又说回来,设置一个基本的文本编辑器并不像您担心的那么难。事实上,大多数编程工具包已经为您提供了文本编辑器的大部分组件。围绕文本编辑的组件,如菜单栏、文件选择对话框等,很容易实现。因此,虽然是一门中级编程课程,但构建基本的文本编辑器非常有趣且简单。您可能会发现自己渴望使用自己制作的工具,而且您使用它的次数越多,您可能需要为它的功能添加更多的灵感,从而更多地了解您正在使用的编程语言。为了使这个练习切合实际,最好选择一种具有令人满意的GUI工具箱的语言。有很多选项,包括Qt、FLTK或GTK,但请务必先查看其文档以确保它具有您期望的功能。对于本文,我使用Java及其内置的Swing小部件集。如果您想使用不同的语言或不同的工具集,这篇文章在如何帮助您方面仍然很有用。无论您选择哪一个,在任何主要工具箱中编写文本编辑器都惊人地相似。如果您是Java新手并且需要有关入门的更多信息,请先阅读我的猜谜游戏文章。项目设置通常,我使用并推荐像Netbeans或Eclipse这样的IDE,但我发现在学习一门新语言时,手工做一些工作很有帮助,这样您就可以更好地理解使用IDE时会发生什么.在本文中,我假设您正在使用文本编辑器和终端进行编程。在开始之前,为您自己的项目创建一个项目目录。在项目文件夹中,创建一个名为src的目录来保存您的源文件。$mkdir-pmyTextEditor/src$cdmyTextEditor在你的src目录中创建一个名为TextEdit.java的空白文件:$touchsrc/TextEditor.java在你最喜欢的文本编辑器中打开这个空白文件自己),然后准备编码!包和导入为确保您的Java应用程序具有唯一标识符,您必须声明一个包名称。典型的格式是使用反向域名,如果您确实拥有一个域名,这将特别容易。如果您没有域名,您可以使用本地作为顶级。与Java和许多语言一样,行以分号结尾。命名Java包后,您必须告诉Java编译器(javac)使用哪些库来构建您的代码。事实上,这通常是您在编写代码时添加的内容,因为您很少事先知道自己需要哪些库。但是,这里有一些库是显而易见的。例如,您知道这个文本编辑器是基于SwingGUI工具包的,因此导入javax.swing.JFrame和javax.swing.UIManager等相关的特定库。包com.example.textedit;导入javax.swing.JFileChooser;导入javax.swing.JFrame;导入javax.swing.JMenu;导入javax.swing.JMenuBar;导入javax.swing.JMenuItem;导入javax.swing.JOptionPane;导入javax.swing.JTextArea;导入javax.swing.UIManager;导入javax.swing.UnsupportedLookAndFeelException;导入javax.swing.filechooser.FileSystemView;导入java.awt.Component;导入java.awt.event.ActionEvent;导入java.awt。事件.ActionListener;导入java.io.File;导入java.io.FileNotFoundException;导入java.io.FileReader;导入java.io.FileWriter;导入java.io.IOException;导入java.util.Scanner;导入java.util.logging.Level;导入java.util.logging.Logger;出于本练习的目的,您可以提前预测所需的所有库。在现实生活中,无论你喜欢哪种语言,你都会在研究如何解决一些问题的过程中发现库,然后将其导入到你的代码中并使用它。不用担心-如果您忘记包含一个库,您的编译器或解释器会警告您!主窗口这是一个单窗口应用程序,因此该应用程序的主类是一个JFrame,带有一个附加的ActionListener,用于捕获菜单事件。在Java中,当您使用现有的小部件元素时,您可以用您的代码“扩展”它。这个主窗口需要三个字段:窗口本身(JFrame的一个实例)、文件选择器返回值的标识符以及文本编辑器本身(JTextArea)。publicfinalclassTextEditextendsJFrameimplementsActionListener{privatestaticJTextAreaarea;privatestaticJFrameframe;privatestaticintreturnValue=0;令人惊讶的是,这几行代码完成了实现一个基本文本编辑器的80%的工作,因为JtextArea是一个Java文本输入字段。其余80行代码中的大部分处理辅助功能,例如保存和打开文件。构建菜单JMenuBar小部件设计在JFrame的顶部,它可以为您提供任意数量的菜单项。Java不是一种拖放式编程语言,因此对于您添加的每个菜单,您还必须编写一个函数。为了使该项目易于管理,我提供了四个功能:创建新文件、打开现有文件、将文本保存到文件以及关闭应用程序。创建菜单的过程与大多数流行的工具箱基本相同。首先,您创建菜单栏本身,然后创建一个顶级菜单(例如,“文件”),然后创建子菜单项(例如,“新建”、“保存”等)。公共TextEdit(){运行();}publicvoidrun(){frame=newJFrame("文本编辑");//设置应用程序的外观(LNF)//尝试默认为主机系统喜欢的任何内容try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(ClassNotFoundException|InstantiationException|IllegalAccessException|UnsupportedLookAndFeelExceptionex){Logger.getLogger(TextEdit.class.getName()).log(Level.SEVERE,null,ex);}//设置应用程序窗口区域的属性=newJTextArea();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(区域);frame.setSize(640,480);frame.setVisible(true);//构建菜单JMenuBarmenu_main=newJMenuBar();JMenumenu_file=newJMenu("文件");JMenuItemmenuitem_new=newJMenuItem("新建");JMenuItemmenuitem_open=newJMenuItem("打开");JMenuItemmenuitem_save=newJMenuItem("保存");JMenuItemmenuitem_quit=newJMenuItem("退出");menuitem_new.addActionListener(这个);menuitem_open.addActionListener(this);menuitem_save.addActionListener(this);menuitem_quit.addActionListener(this);菜单文件);menu_file.add(menuitem_new);menu_file.add(menuitem_open);menu_file.add(menuitem_save);menu_file.add(menuitem_quit);frame.setJMenuBar(menu_main);编程菜单操作中描述的功能您的应用程序响应菜单选择,因为您的JFrame附加了一个ActionListener。在Java中,当您实现一个事件处理程序时,您必须“覆盖”它的内置函数。听起来很可怕。您不是在重写Java;您只是在实现已定义但尚未实现事件处理程序的函数。在这种情况下,您必须覆盖actionPerformed方法。由于“文件”菜单中的所有项目都与处理文件有关,因此我在我的代码中很早就定义了一个JFileChooser。其余代码分为if语句的子语句,看起来像是收到事件时相应执行的操作。每个子语句都与其他子语句完全不同,因为每个项目都表示完全独特的东西。最相似的是“打开”和“保存”,因为它们都使用JFileChooser在文件系统中选择一个位置来获取或放置数据。“新建”菜单会在没有警告的情况下清理JTextArea,“退出”菜单会在没有警告的情况下关闭应用程序。这两个“功能”都是不安全的,所以如果您想稍微改进一下这段代码,这是一个好的开始。保存内容前的友好警告是任何好的文本编辑器的基本功能,但这里为了简单起见,这是一个未来的功能。@OverridepublicvoidactionPerformed(ActionEvente){Stringingest=null;JFileChooserjfc=newJFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());jfc.setDialogTitle("选择目的地。");jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);Stringae=e.getActionCommand();if(ae.equals("Open")){returnValue=jfc.showOpenDialog(null);if(returnValue==JFileChooser.APPROVE_OPTION){文件f=新文件(jfc.getSelectedFile().getAbsolutePath());try{FileReaderread=newFileReader(f);Scannerscan=newScanner(读取);while(scan.hasNextLine()){Stringline=scan.nextLine()+"\n";摄取=摄取+线;}area.setText(摄取);}catch(FileNotFoundExceptionex){ex.printStackTrace();}}//保存}elseif(ae.equals("Save")){returnValue=jfc.showSaveDialog(null);尝试{Filef=newFile(jfc.getSelectedFile().getAbsolutePath());FileWriterout=newFileWriter(f);out.write(area.getText());出去。关闭();}catch(FileNotFoundExceptionex){组件f=null;JOptionPane.showMessageDialog(f,"找不到文件。");}catch(IOExceptionex){组件f=null;JOptionPane.showMessageDialog(f,"错误。");}}elseif(ae.equals("New")){区域。设置文本(“”);}elseif(ae.equals("Quit")){System.退出(0);}}}从技术上讲,这当然就是这个文本编辑器的全部内容,并没有真正做太多,除了这里仍然有测试和打包步骤,所以仍然有足够的时间来发现遗漏的要点。假设您没有注意到提示:此代码中一定缺少某些内容。你现在知道缺少什么了吗?(在猜谜游戏文章中多次提到。)测试现在您可以测试您的应用程序。从终端启动您编写的文本编辑器:$java./src/TextEdit.javaerror:can'tfindmain(String[])methodinclass:com.example.textedit.TextEdit它在代码中看起来像主要方法是没有得到。以下是解决此问题的一些方法:您可以在TextEdit.java中创建一个main方法并让它运行TextEdit类的一个实例,或者您可以创建一个包含main方法的单独文件。这两种方法都可以,但在更大的项目预期中,后者更明智,因此值得使用使用单独文件的方法来处理它,使其成为一个完整的应用程序。在src中创建一个Main.java文件并在您喜欢的编辑器中打开它:packagecom.example.textedit;publicclassMain{publicstaticvoidmain(String[]args){}}你可以再试一次,但是现在有两个相互依赖的文件要运行,所以你必须编译代码。Java使用javac编译器,您可以使用-d选项设置目标目录:$javacsrc/*java-d。这将创建一个完全按照您的包名称com/example/textedit目录结构建模的新目录结构。这个新的类路径包含文件Main.class和TextEdit.class,它们构成了您的应用程序。您可以使用java并通过引用主类的位置和名称(而不是文件名)来运行它们:$javainfo/slackermedia/textedit/Main`您的文本编辑器已打开,您可以在其中键入内容、打开文件,然后甚至保存您的工作。带有单个下拉菜单的白色文本编辑器框,带有文件、新建、打开、保存和退出菜单将您的工作作为Java包共享,尽管一些程序员似乎可以识别各种源文件但是,Java使打包应用程序变得非常容易以便其他人可以轻松运行它。你已经有了大部分必要的结构,但你仍然需要一些元数据到Manifest.txt文件中:许多选项对您来说可能看起来很熟悉。要创建JAR文件:$jarcvfmeTextEdit.jarManifest.txtcom.example.textedit.Maincom/example/textedit/*.class从命令的语法,您可以推断它将创建一个名为TextEdit.jar的新JAR文件,它需要的清单数据位于Manifest.txt中。它的主类定义为包名的扩展,类本身是com/example/textedit/Main.class。您可以查看JAR文件的内容:$jartvfTextEdit.jar0WedNov25META-INF/105WedNov25META-INF/MANIFEST.MF338WedNov25com/example/textedit/textedit/Main.class4373WedNov25com/example/textedit/textedit/TextEdit.class如果您想查看您的元数据是如何集成到MANIFEST.MF文件中的,您甚至可以使用xvf选项来提取它。使用java命令运行JAR文件:$java-jarTextEdit.jar您甚至可以创建桌面文件,以便在单击应用程序菜单中的图标时启动应用程序。改进它在目前的状态下,这是一个非常基本的文本编辑器,最适合做快速笔记或简短的自述文件。一些改进(如添加垂直滚动条)可以通过一些研究快速轻松地完成,而其他改进(如实施广泛的偏好系统)将需要实际工作。但如果你一直想学习一门新的语言,这可能是一个完美的自学实践项目。创建一个文本编辑器,如您所见,在代码方面处理起来并不太难,在一定程度上是可管理的。如果您经常使用文本编辑器,那么编写自己的文本编辑器可能会让人感到满足和乐趣。因此,启动您最喜欢的文本编辑器(您编写的那个),并开始添加功能!