Java实现简易文本编辑器

article/2025/11/9 10:50:43

数据结构课设要求完成一个简易文本编辑器,以下记录完成过程中的思路,学习到的新知识,遇到的问题和解决方案等。

要求至少实现以下要求:
1)具有图形菜单界面
2)查找,替换(等长, 不等长),插入(插串,文本块的插入)、快移动(行块,列块移动),删除
3)可正确存盘、取盘
4)正确显示总行数

新学到的方法:

  • ActionEvent 的 getSource()
    继承自 EventObject;返回最初发生 Event 的对象。

  • public int getlineofoffset(int offset) throws badlocationexception
    将文本中的偏移量offset转化为行号

  • public int getCaretPosition()
    返回文本插入符的位置。插入符的位置被限制在 0 和文本最后一个字符(包括)之间。如果没有设置文本或插入符,则默认插入符的位置为 0。

  • indexOf() 方法有以下四种形式:
    public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
    public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回-1。
    int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
    int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
    同样的,还有lastIndexOf()返回最后一次出现的位置,反向搜索

  • getDocument()
    getDocuemnt

  • public component getfocusowner()
    如果此窗口为焦点窗口,则返回是焦点窗口的子组件;
    否则(即该窗口不是焦点窗口)返回 null。

  • public boolean isfocused()
    返回:此窗口是否为焦点窗口。如果存在焦点所有者,则焦点窗口就是(或者包含)焦点所有者的窗口。如果不存在焦点所有者,则没有作为焦点的窗口。
    如果焦点窗口是一个 frame 或 dialog,那么它同时也是一个活动窗口。否则,活动窗口将是拥有焦点窗口的第一个 frame 或 dialog。

出现的问题及解决方案

  • 使用BufferedReader出现中文乱码的情况
    解决:文件保存的时候设置编码为“ANSI”
    在这里插入图片描述

  • 完成选择文本用键盘的左右键实现左右移动的时候

						  input.replaceSelection("");String text = input.getText();text = text.substring(0,position)+sText+text.substring(position,text.length());input.setText(text);input.setCaretPosition(position+sText.length()-1);input.select(input.getCaretPosition()-sText.length()+1, input.getCaretPosition()+1);

我想要实现可以持续进行左右移动的效果,也就是触发键盘监听器实现左/右移动后仍然选择该文本,使用input.select(…)其中input是JTextArea文本输入区域,但是出现的状况是文本并没有被选择中,但是通过调试可以发现文本是被选择了的只是没有被高亮,因此思路转到焦点上,可以发现JTextArea是焦点Componet,但该窗口不是焦点窗口(getFocusOwner()==null)。但是加入System.out.println(getFocusOwner().getX());会报NullPointerException,但是也能实现窗口聚焦的功能,现在还没解决问题。

完成思路

  • 需要动态地获取当前光标所在位置
input.addCaretListener(new CaretListener() {@Overridepublic void caretUpdate(CaretEvent e) {JTextArea editArea = (JTextArea)e.getSource();int lineNum = 1;int columnNum = 1;try{int caretpos = editArea.getCaretPosition();//获取当前光标偏移量lineNum = editArea.getLineOfOffset(caretpos);//获取当前光标所在位置的行偏移量columnNum = caretpos - editArea.getLineStartOffset(lineNum);//当前光标所在的列位置就是caretpos-这一行最初的列偏移量lineNum += 1;//然后再将行的数目加1(从0开始计算偏移量)}catch(Exception ex) { }updateStatus(lineNum, columnNum);//updateStatus是更新状态栏的方法}});
  • 需要正确的获取文本内容的总行数
    不能凭借光标的位置来判断总行数,应该以最后有内容的一行的行数来作为文本内容的总行数。记录光标到达过的最大行数maxCaretLine,从这一行开始判断,如果这一行为空,则再往上一行判断,如果这一行不为空,则为最后有内容的一行的行数。最初想到的判断方法是
for(int i = maxCaretLine;i >= 0;i --){String value = input.getText().split("\r\n")[i];if(value != null){line = i;break;}}

但在换行的时候出现了问题,如果以分隔符来判断,换行后本来maxCaretLine应该等于2了,但是由于换行后用分隔符分割开的数组大小仍然为1(此时换行后还未新增内容)并且中间无论跳多少行都算作一行,所以改用BufferReader来读取每一行

  • 打开和保存文件的选择路径方法我最开始使用的是JFileChooser
int result = 0;String path = null;JFileChooser fileChooser = new JFileChooser();FileSystemView fsv = FileSystemView.getFileSystemView(); System.out.println(fsv.getHomeDirectory()); fileChooser.setCurrentDirectory(fsv.getHomeDirectory());fileChooser.setDialogTitle("打开");fileChooser.setApproveButtonText("确定");fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);fileChooser.addChoosableFileFilter(new FileFilter(){ @Overridepublic String getDescription() {return "文本文件";     }@Overridepublic boolean accept(File f) {if (f.getAbsolutePath().endsWith(".txt") || f.isDirectory())     return true;     return false;}});result = fileChooser.showOpenDialog(openning);

但是后来找到了FileDialog(觉得更好看qaq)

  • 文本筛选器:筛选出文本文件
fileChooser.addChoosableFileFilter(new FileFilter()
{ @Overridepublic String getDescription() {return "文本文件";     }@Overridepublic boolean accept(File f) {if (f.getAbsolutePath().endsWith(".txt") || f.isDirectory())     return true;     return false;}}); 

但是FileDialog对上面的方法不适用,并没有适用。jdoc的原注释为:Filename filters do not function in Sun’s reference implementation for Microsoft Windows.
所以就换了一种比较通俗的方法

FileDialog also = new FileDialog(openning,"另存为",FileDialog.SAVE);
also.setFile("*.txt;");

直接将要查找的文件名设置为*.txt,就可以直接找到以txt为后缀的文件了。
暂时还没有找到更合适的筛选器。
在这里插入图片描述

  • 实现移动整行和整列的效果:
    思路:【数组】需要标识行数和列数——【二维数组】将每一行的数据保存在一个数组中,每一行用“\n”分割开为数组,每一行的字串再用“”分开,形成二维数组:
					String s = input.getText();String[][] a;String[] sFirst=s.split("\n");a=new String[sFirst.length][];		//sFirst.length表示有多少行for(int i=0;i<sFirst.length;i++){String[] sSecond= sFirst[i].split("");		a[i]=new String[sSecond.length];//sSecond.length分别表示每一行有多少列for(int j=0;j<sSecond.length;j++){a[i][j] = sSecond[j];if(maxColumn < a[i].length)maxColumn = a[i].length;}}					

但在进行移动的时候,例如将第2行移动到第7行,那么第3-7行都要上移

							String[] usedString = a[used-1];int i = used;for(;i < after; i++){a[i-1] = a[i]; }d[after-1] = usedString;

如果行数间隔大的话,for循环的时间就更长了,显然没有链表方便,【二维链表】将每一行的数据保存在一个单向链表中,将每一行的表头保存在一个行链表中形成一个二维链表,这样在移动的时候只需要更改一项就可以了。


http://chatgpt.dhexx.cn/article/QAQuCpZq.shtml

相关文章

使用文本编辑器编写Java源代码

使用文本编辑器编写Java源代码 编写 J a v a Java Java应用程序&#xff0c;可以使用任何一个文本编辑器来编写程序的源代码&#xff0c;然后使用 J D K JDK JDK搭配的工具进行编译和运行&#xff0c;在这里&#xff0c;我将介绍一个使用简单的文本编辑器来开发一个 J a v a J…

java集成富文本编辑器UEditor

JAVA集成富文本编辑器UEditor 集成前说明集成UEditor一.UEditor下载二.UEditor迁入项目三.引入ueditor中的js四.初始化UEditor五.实现图片上传 集成前说明 其实java独立集成ueditor是个伪命题,集成ueditor需要前后端共同参与才能完成,因为集成ueditor的时候,两端都有对应的配置…

java实现文本编辑器

利用swing组件JEditText实现复制&#xff0c;粘贴&#xff0c;剪切功能,JEditText组测MouseListener,实现JPopupMenu右键弹出菜单&#xff0c;依次为JMenuItem&#xff0c;openButton&#xff0c;saveButton注册ActionListener&#xff0c;实现点击事件。Word.java: import ja…

JAVA实现简易文本编辑器设计

废话不多说直接上代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.plaf.FontUIResource; import javax.swing.text.Document; import java…

使用文本编辑器开发一个Java程序的详细步骤

概述 前提&#xff1a; 在学习本博文之前&#xff0c;您需要搭建好Java环境&#xff0c;其中包括1.JDK(Java开发工具箱)的下载&#xff1b;2.JDK环境变量的设置。 就目前对于Java程序的开发现状看的话&#xff0c;都是采用的流行的开发工具&#xff0c;其优点对于开发人员来说…

java 常用富文本编辑器_常用的六个富文本编辑器

1&#xff1a;:功能齐全 tinymce|TinyMCE | The Most Advanced WYSIWYG HTML Editor TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器&#xff0c;由JavaScript写成。它对IE6和Firefox1.5都有着非常良好的支持。 图片发自简书App 2&#xff1a;百度 ueditor|UEditor - 首页…

Java实现百度富文本编辑器UEditor

说起来 实现百度富文本编辑器也是比较简单&#xff0c;主要就是 读取 config.json 但是里面的坑也比较大 下面是我的步骤 以及我遇坑的过程 准备引入的jar包 这两个包找不到的话 可以去官网、也可以加群Java交流群&#xff0c;在群文件自行下载: QQ群&#xff1a;808249297 …

富文本编辑器在Java中使用

一、ckeditor 1&#xff09; 下载ckeditor_3.6.2.zip和ckeditor-java-core-3.5.3.zip两个压缩文件 下载地址:http://ckeditor.com 2&#xff09; 解压缩文件ckeditor_3.6.2.zip和ckeditor-java-core-3.5.3.zip两个文件&#xff0c; 在ckeditor_3.6.2文件中有ckeditor文件…

(JAVA)利用GUI编写简单文本编辑器

今天我们来尝试写一段代码&#xff0c;编写一个简单的文本编辑器&#xff0c;一起来看看吧&#xff01; 首先我们需要用到Java中的继承&#xff08;extends&#xff09;、接口&#xff08;implements&#xff09;。我们将其分为两个文件&#xff1a;一个文件中是所有的布局和逻…

Java设计文本编辑器

阿乐今天敲代码没 Java设计文本编辑器 前言一、实现功能二、扼要代码1.界面程序设计2.文件菜单设计3.编辑菜单栏设计4.格式菜单栏设计 运行截图 前言 利用Java设计一个文本编辑器。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、实现功能 该简易…

Java课设——文本编辑器

来自&#xff1a;https://blog.csdn.net/qq_39169598/article/details/84726959 原创不易&#xff0c;转载请加上作者 一、需求 编程实现一个文本编辑器&#xff0c;使其具有新建、打开、保存&#xff0c;编辑&#xff08;查找、替换、大小写转换等&#xff09;、统计&#…

用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行

Java做文本编辑器的项目&#xff0c;搜了下看到网上有各种版本的Java文本编辑器有很多种&#xff0c;但有的实现很麻烦&#xff0c;最近刚好在做这个实现就也发一个&#xff0c;代码写得很朴素&#xff0c;注释无比详细。 测试过没有Bug&#xff0c;如果有什么问题&#xff0c…

Java实现简单的文本编辑器

1、首先创建一个编辑器EditorDemo类&#xff0c;继承JFrame类&#xff0c;具体实现编码如下&#xff1a; 2、创建菜单栏&#xff0c;新增各个菜单项&#xff0c;比如文件、编辑、帮助等功能&#xff0c;新增createJMenuBar方法如下&#xff1a; /*** 创建菜单栏* param acti…

你知道在深圳一个月花多少钱吗?

在深圳一个月花多少钱&#xff0c;才能活得比较像样&#xff1f; 早上上班挤地铁转公共&#xff0c;7到10块钱&#xff0c;中午在公司叫一份外卖&#xff0c;22块钱到30块钱&#xff0c;晚上加班和同事一起吃饭&#xff0c;25块左右&#xff0c;赶上末班地铁7块钱&#xff0c;房…

开发一个app需要多少钱

APP应用开发主要分为原生APP和HTML5APP开发&#xff0c;使用HTML5开发的app价格不是很高&#xff0c;但是在体验上&#xff0c;访问速度上比原生的有差距。 第一、商城类app报价计算 以H5的封装案例&#xff0c;价格比较便宜&#xff0c;商城价格几万就能搞定&#xff0c;不会超…

一般培训python要多少钱

Python语言相对简单并且非常适合初学者&#xff0c;使初学者可以专注于编程逻辑&#xff0c;而不会陷入晦涩的语法细节中。 学习python提供了比其他任何编程语言更多的职业发展选择。 那么&#xff0c;python培训班一般要多少钱&#xff1f; 伴随着互联网技术的迅猛发展&…

微信小程序开发一个多少钱

小程序开发是当前比较流行的一项技术服务&#xff0c;能够为企业和个人带来巨大的商业价值和社会价值&#xff0c;但是小程序开发费用也是潜在的成本之一。在选择小程序开发服务时&#xff0c;了解开发费用如何计算、影响价格的因素以及如何降低成本等方面的知识&#xff0c;可…

开发一个App大概要多少钱?

结合自己的各种采坑失败经验以及周边个别成功试水经验&#xff0c;站在个人角度给出一些理解。 APP制作有多种形式&#xff0c;所以需要的成本差异较大。 1.寻找外包公司 2.模板APP&#xff08;内行叫SAAS&#xff09; 3.自己组建团队 目录 互联网外包公司的成本构成&#…

chatgpt赋能python:如何让Python暂停?

如何让Python暂停&#xff1f; Python是一种高级编程语言&#xff0c;常用于数据分析、机器学习等领域。在Python编程中&#xff0c;我们经常需要让程序执行暂停一段时间&#xff0c;等待某些操作完成。本文将介绍如何让Python暂停&#xff0c;以及如何在SEO中优化文章标题&am…

独家 | ChatGPT可以解决分级和分类这样的简单机器学习任务

作者&#xff1a;Damir Yalalov 翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约1100字&#xff0c;建议阅读5分钟 本文介绍了ChatGPT如何解决简单的机器学习任务并给出了鸢尾花分类和城市预测两个案例。 一句话概括&#xff1a; ChatGPT可以帮助你完成简单的机器学习任务…