Java实现简易文本编辑器
數(shù)據(jù)結(jié)構(gòu)課設(shè)要求完成一個(gè)簡(jiǎn)易文本編輯器,以下記錄完成過(guò)程中的思路,學(xué)習(xí)到的新知識(shí),遇到的問(wèn)題和解決方案等。
要求至少實(shí)現(xiàn)以下要求:
1)具有圖形菜單界面
2)查找,替換(等長(zhǎng), 不等長(zhǎng)),插入(插串,文本塊的插入)、快移動(dòng)(行塊,列塊移動(dòng)),刪除
3)可正確存盤(pán)、取盤(pán)
4)正確顯示總行數(shù)
新學(xué)到的方法:
-
ActionEvent 的 getSource()
繼承自 EventObject;返回最初發(fā)生 Event 的對(duì)象。 -
public int getlineofoffset(int offset) throws badlocationexception
將文本中的偏移量offset轉(zhuǎn)化為行號(hào) -
public int getCaretPosition()
返回文本插入符的位置。插入符的位置被限制在 0 和文本最后一個(gè)字符(包括)之間。如果沒(méi)有設(shè)置文本或插入符,則默認(rèn)插入符的位置為 0。 -
indexOf() 方法有以下四種形式:
public int indexOf(int ch): 返回指定字符在字符串中第一次出現(xiàn)處的索引,如果此字符串中沒(méi)有這樣的字符,則返回 -1。
public int indexOf(int ch, int fromIndex): 返回從 fromIndex 位置開(kāi)始查找指定字符在字符串中第一次出現(xiàn)處的索引,如果此字符串中沒(méi)有這樣的字符,則返回-1。
int indexOf(String str): 返回指定字符在字符串中第一次出現(xiàn)處的索引,如果此字符串中沒(méi)有這樣的字符,則返回 -1。
int indexOf(String str, int fromIndex): 返回從 fromIndex 位置開(kāi)始查找指定字符在字符串中第一次出現(xiàn)處的索引,如果此字符串中沒(méi)有這樣的字符,則返回 -1
同樣的,還有l(wèi)astIndexOf()返回最后一次出現(xiàn)的位置,反向搜索 -
getDocument()
-
public component getfocusowner()
如果此窗口為焦點(diǎn)窗口,則返回是焦點(diǎn)窗口的子組件;
否則(即該窗口不是焦點(diǎn)窗口)返回 null。 -
public boolean isfocused()
返回:此窗口是否為焦點(diǎn)窗口。如果存在焦點(diǎn)所有者,則焦點(diǎn)窗口就是(或者包含)焦點(diǎn)所有者的窗口。如果不存在焦點(diǎn)所有者,則沒(méi)有作為焦點(diǎn)的窗口。
如果焦點(diǎn)窗口是一個(gè) frame 或 dialog,那么它同時(shí)也是一個(gè)活動(dòng)窗口。否則,活動(dòng)窗口將是擁有焦點(diǎn)窗口的第一個(gè) frame 或 dialog。
出現(xiàn)的問(wèn)題及解決方案
-
使用BufferedReader出現(xiàn)中文亂碼的情況
解決:文件保存的時(shí)候設(shè)置編碼為“ANSI”
-
完成選擇文本用鍵盤(pán)的左右鍵實(shí)現(xiàn)左右移動(dòng)的時(shí)候
我想要實(shí)現(xiàn)可以持續(xù)進(jìn)行左右移動(dòng)的效果,也就是觸發(fā)鍵盤(pán)監(jiān)聽(tīng)器實(shí)現(xiàn)左/右移動(dòng)后仍然選擇該文本,使用input.select(…)其中input是JTextArea文本輸入?yún)^(qū)域,但是出現(xiàn)的狀況是文本并沒(méi)有被選擇中,但是通過(guò)調(diào)試可以發(fā)現(xiàn)文本是被選擇了的只是沒(méi)有被高亮,因此思路轉(zhuǎn)到焦點(diǎn)上,可以發(fā)現(xiàn)JTextArea是焦點(diǎn)Componet,但該窗口不是焦點(diǎn)窗口(getFocusOwner()==null)。但是加入System.out.println(getFocusOwner().getX());會(huì)報(bào)NullPointerException,但是也能實(shí)現(xiàn)窗口聚焦的功能,現(xiàn)在還沒(méi)解決問(wèn)題。
完成思路
- 需要?jiǎng)討B(tài)地獲取當(dāng)前光標(biāo)所在位置
- 需要正確的獲取文本內(nèi)容的總行數(shù)
不能憑借光標(biāo)的位置來(lái)判斷總行數(shù),應(yīng)該以最后有內(nèi)容的一行的行數(shù)來(lái)作為文本內(nèi)容的總行數(shù)。記錄光標(biāo)到達(dá)過(guò)的最大行數(shù)maxCaretLine,從這一行開(kāi)始判斷,如果這一行為空,則再往上一行判斷,如果這一行不為空,則為最后有內(nèi)容的一行的行數(shù)。最初想到的判斷方法是
但在換行的時(shí)候出現(xiàn)了問(wèn)題,如果以分隔符來(lái)判斷,換行后本來(lái)maxCaretLine應(yīng)該等于2了,但是由于換行后用分隔符分割開(kāi)的數(shù)組大小仍然為1(此時(shí)換行后還未新增內(nèi)容)并且中間無(wú)論跳多少行都算作一行,所以改用BufferReader來(lái)讀取每一行
- 打開(kāi)和保存文件的選擇路徑方法我最開(kāi)始使用的是JFileChooser
但是后來(lái)找到了FileDialog(覺(jué)得更好看qaq)
- 文本篩選器:篩選出文本文件
但是FileDialog對(duì)上面的方法不適用,并沒(méi)有適用。jdoc的原注釋為:Filename filters do not function in Sun’s reference implementation for Microsoft Windows.
所以就換了一種比較通俗的方法
直接將要查找的文件名設(shè)置為*.txt,就可以直接找到以txt為后綴的文件了。
暫時(shí)還沒(méi)有找到更合適的篩選器。
- 實(shí)現(xiàn)移動(dòng)整行和整列的效果:
思路:【數(shù)組】需要標(biāo)識(shí)行數(shù)和列數(shù)——【二維數(shù)組】將每一行的數(shù)據(jù)保存在一個(gè)數(shù)組中,每一行用“\n”分割開(kāi)為數(shù)組,每一行的字串再用“”分開(kāi),形成二維數(shù)組:
但在進(jìn)行移動(dòng)的時(shí)候,例如將第2行移動(dòng)到第7行,那么第3-7行都要上移
String[] usedString = a[used-1];int i = used;for(;i < after; i++){a[i-1] = a[i]; }d[after-1] = usedString;如果行數(shù)間隔大的話(huà),for循環(huán)的時(shí)間就更長(zhǎng)了,顯然沒(méi)有鏈表方便,【二維鏈表】將每一行的數(shù)據(jù)保存在一個(gè)單向鏈表中,將每一行的表頭保存在一個(gè)行鏈表中形成一個(gè)二維鏈表,這樣在移動(dòng)的時(shí)候只需要更改一項(xiàng)就可以了。
總結(jié)
以上是生活随笔為你收集整理的Java实现简易文本编辑器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第三十三期:对于人工智能的恐惧及其5个解
- 下一篇: 朱建辉php,朱建辉/laravel-b