欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java運(yùn)用SWT插件編寫(xiě)桌面記事本應(yīng)用程序

 更新時(shí)間:2020年12月31日 09:58:10   作者:chance2015  
這篇文章主要為大家介紹了一個(gè)Java項(xiàng)目實(shí)戰(zhàn),一步步教你實(shí)現(xiàn)記事本,步驟很詳細(xì),運(yùn)用SWT插件手把手編寫(xiě)記事本,感興趣的小伙伴們可以參考一下

本文實(shí)例介紹了Java基于SWT編寫(xiě)記事本的詳細(xì)過(guò)程,分享給大家供大家參考,具體內(nèi)容如下

可實(shí)現(xiàn)windows系統(tǒng)桌面記事本基本功能,傻瓜式教學(xué),一步一步手把手操作。小白也可自己編寫(xiě)出完整的應(yīng)用程序。
需要工具:Eclipse(帶SWT插件)
成品如下:

應(yīng)用程序功能介紹:

功能分析:

  • 1.文件(F)
  • 2.編輯(E)
  • 3.格式(O)
  • 4.查看(V)
  • 5.幫助(H)

其中文件菜單中包括

1.1.新建(N) Ctrl+N
1.2打開(kāi)(O) Ctrl+O
1.3保存(S) Ctrl+S
1.4另存為(A)
1.5退出(X)

其中編輯菜單中包括:

2.1撤銷(xiāo)(U) Ctrl+Z
2.2剪切(T) Ctrl+T
2.3復(fù)制(C) Ctrl+C
2.4粘貼(P) Ctrl+V
2.5刪除(L) Del
2.6查找(D) Ctrl+F
2.7查找下一處(N) F3
2.8替換(R) Ctrl+H
2.9轉(zhuǎn)到(G) Ctrl+G
2.10全選(A) Ctrl+A
2.11時(shí)間/日期(D) F5

其中格式菜單中包括

3.1自動(dòng)換行(W)
3.2字體(F)

其中查看菜單中包括

4.1狀態(tài)欄(S)

其中幫助菜單中包括
5.1查看幫助(H)
5.2關(guān)于記事本(A)
接下來(lái)會(huì)一步一步教大家手把手編寫(xiě)一個(gè)記事本
具體的幾個(gè)類(lèi)如下:
1.NotePad.java
該類(lèi)為主界面類(lèi),其中包含了各個(gè)按鈕的監(jiān)聽(tīng)事件
2.Util.java類(lèi)
該類(lèi)為輔助類(lèi),方便在別的類(lèi)中調(diào)用主窗口類(lèi)中定義的成員
3.AboutAuthor.java
關(guān)于作者的類(lèi),一個(gè)Dialog窗口,用于顯示作者信息
4.FindWindow.java
查找功能的一個(gè)Dialog窗口
5.Go_To.java
轉(zhuǎn)到功能的一個(gè)Dialog窗口
6.OpenMethod.java
里面封裝了打開(kāi)文件的兩個(gè)方法
7.SavaMethod.java
封裝了保存文件的兩種方法
8.SWTResourceManager.java
該類(lèi)為外部導(dǎo)入的類(lèi),用于加載圖片
9.test.java
程序入口,方便之后的打包程jar文件
10.QuitMethod.java
封裝了關(guān)閉窗口的兩種方法

編寫(xiě)步驟:

一.新建SWT項(xiàng)目以及第一個(gè)窗口的創(chuàng)建

打開(kāi)Eclipse,new->other->WindowBuilder->SWT Designer->SWT/JFace Java Project .將project name 命名為 NotePad

打開(kāi)新建好的NotePad工程,在scr處右鍵 new->Package 新建一個(gè)包,命名為com.chance.org
tips:包的命名規(guī)則,最好用com.自定義.org ,別問(wèn)為什么,以后工作了你就會(huì)明白了。
右鍵新建好的包 new->other ->WindowBuilder->SWT Designer -> SWT ->Application Window 命名為NotePad
到此,我們便建好了第一個(gè)SWT窗口點(diǎn)擊source右邊的design即可查看新建號(hào)的圖形界面,實(shí)現(xiàn)可視化編程。
將NotePad窗體中屬性(Properties)里的txt屬性改名為:NotePad
將Composites中的Composites組件拖入NotePad組件下,并將其Layout屬性修改為FillLayout,即填充式布局,這樣即可方便后面將整個(gè)界面變成編輯域。接著將text組件拖入Composites組件下。將text組件的屬性Style中的h_scroll屬性以及v_scroll屬性勾選為true
說(shuō)明:h_scroll為橫向滾動(dòng)條,v_scroll為縱向滾動(dòng)條

二.設(shè)置菜單欄的相關(guān)標(biāo)簽以及窗體總體布局

選擇Menu bar組件 將其拖入主窗體中

1.設(shè)置第一個(gè)菜單項(xiàng)(文件)

選擇Cascde Menu組件,將其拖入Menu bar組件中,修改屬性:variable屬性修改為file_menu, text修改為 文件(F);
1.1設(shè)置子菜單:新建(N) Ctrl+N
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為new_file, text修改為:新建(N) Ctrl+N;
1.2設(shè)置子菜單:打開(kāi)(O) Ctrl+O
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為open_file, text修改為:打開(kāi)(O) Ctrl+O
1.3設(shè)置子菜單:保存(O) Ctrl+S
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為save_file, text修改為: 保存(O) Ctrl+S
1.4設(shè)置子菜單:另存為(A)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為save_as, text修改為: 另存為(A)
1.5設(shè)置子菜單:退出(X)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為quit, text修改為: 退出(X)

2.設(shè)置第二個(gè)菜單項(xiàng)(編輯)

選擇Cascde Menu組件,將其拖入Menu bar組件中,修改屬性:variable屬性修改為edit_menu, text修改為 編輯(E);
2.1設(shè)置子菜單:撤銷(xiāo)(U) Ctrl+Z
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為undo, text修改為: 撤銷(xiāo)(U) Ctrl+Z, 并將enable改為false;
2.2設(shè)置子菜單:剪切(T) Ctrl+T
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為cut, text修改為: 剪切(T) Ctrl+T, 并將enable改為false;
2.3設(shè)置子菜單:復(fù)制(C) Ctrl+C
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為copy, text修改為: 復(fù)制(C) Ctrl+C, 并將enable改為false;
2.4設(shè)置子菜單:粘貼(P) Ctrl+V
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為paste, text修改為: 粘貼(P) Ctrl+V
2.5設(shè)置子菜單:刪除(L) Del
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為delete, text修改為: 刪除(L) Del, 并將enable改為false;
2.6設(shè)置子菜單:查找(D) Ctrl+F
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為find, text修改為: 查找(D) Ctrl+F, 并將enable改為false;
2.7設(shè)置子菜單:查找下一處(N) F3
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為find_next, text修改為: 查找下一處(N) F3, 并將enable改為false;
2.8設(shè)置子菜單:替換(R) Ctrl+H
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為replace, text修改為: 替換(R) Ctrl+H, 并將enable改為false;
2.9設(shè)置子菜單:轉(zhuǎn)到(G) Ctrl+G
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為go_to, text修改為: 轉(zhuǎn)到(G) Ctrl+G
2.10設(shè)置子菜單:全選(A) Ctrl+A
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為selectAll, text修改為: 全選(A) Ctrl+A
2.11設(shè)置子菜單:時(shí)間/日期(D) F5
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為showDate, text修改為: 時(shí)間/日期(D) F5

3.設(shè)置第三個(gè)菜單項(xiàng)(格式)

選擇Cascde Menu組件,將其拖入Menu bar組件中,修改屬性:variable屬性修改為format_menu, text修改為 格式(O);
3.1設(shè)置子菜單:自動(dòng)換行(W)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為auto_Enter, text修改為: 自動(dòng)換行(W)
3.2設(shè)置子菜單:字體(F)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為setFont, text修改為: 字體(F)

4.設(shè)置第四個(gè)菜單項(xiàng)(查看)

選擇Cascde Menu組件,將其拖入Menu bar組件中,修改屬性:variable屬性修改為view_menu, text修改為 查看(V);
4.1設(shè)置子菜單:狀態(tài)欄(S)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為state, text修改為: 狀態(tài)欄(S)

5.設(shè)置第五個(gè)菜單項(xiàng)(幫助)

選擇Cascde Menu組件,將其拖入Menu bar組件中,修改屬性:variable屬性修改為help_menu, text修改為 幫助(H);
5.1設(shè)置子菜單:查看幫助(H)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為lookHelp, text修改為: 查看幫助(H)
5.2設(shè)置子菜單:關(guān)于記事本(A)
選擇Menu Item加入到Cascde Menu組件下,修改屬性:variable屬性修改為aboutAuthor, text修改為: 關(guān)于記事本(A)
至此,已將整個(gè)頁(yè)面布局設(shè)置完畢
效果圖如下:

接下來(lái)實(shí)現(xiàn)各個(gè)功能

三.設(shè)置菜單快捷鍵

setAccelerator()函數(shù)的介紹:使用setAccelerator()函數(shù)設(shè)置相關(guān)的快捷鍵,傳入的參數(shù)為鍵值
例如快捷鍵Ctrl+N 設(shè)置方法為: 對(duì)象. setAccelerator(SWT.CTrl+'N');
快捷鍵F5 設(shè)置方法為:對(duì)象.setAccelerator(SWT.F5);
由此我們可以將所需的全部快捷鍵設(shè)置出來(lái)

 new_file.setAccelerator(SWT.CTRL + 'N'); //新建文件快捷鍵
 open_file.setAccelerator(SWT.CTRL + 'O');//保存文件快捷鍵
 undo.setAccelerator(SWT.CTRL + 'Z'); //撤銷(xiāo)快捷鍵
 cut.setAccelerator(SWT.CTRL + 'T'); //剪切快捷鍵
 copy.setAccelerator(SWT.CTRL + 'C'); //復(fù)制快捷鍵
 paste.setAccelerator(SWT.CTRL + 'V'); //粘貼快捷鍵
 delete.setAccelerator(SWT.DEL); //刪除快捷鍵
 find.setAccelerator(SWT.CTRL + 'F'); //查找快捷鍵
 find_next.setAccelerator(SWT.F3); //查找下一處快捷鍵
 replace.setAccelerator(SWT.CTRL + 'H'); //替換快捷鍵
 go_to.setAccelerator(SWT.CTRL + 'G'); //轉(zhuǎn)到快捷鍵
 selectAll.setAccelerator(SWT.CTRL + 'A');//全選快捷鍵
 showDate.setAccelerator(SWT.F5); //顯示時(shí)間快捷鍵

四.添加事件監(jiān)聽(tīng)函數(shù)(1)文件類(lèi)

為文件每個(gè)菜單添加事件監(jiān)聽(tīng)函數(shù)

1.添加”退出” 菜單的監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單將退出應(yīng)用程序
退出的實(shí)現(xiàn)比較簡(jiǎn)單,調(diào)用系統(tǒng)函數(shù)System.exit(0);即可
在design模式下點(diǎn)擊”時(shí)間/日期(F5)”組件 再點(diǎn)擊”Show event”->selection->雙擊widgetSelected
事件代碼如下:

quit.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"退出"菜單的監(jiān)聽(tīng)事件
 * 功能描述:觸發(fā)該菜單將退出應(yīng)用程序
 */
 public void widgetSelected(SelectionEvent e) {
 System.exit(0);
 }
 });

但事實(shí)真的這么簡(jiǎn)單嗎,其實(shí)不然,哪有點(diǎn)擊退出就直接退出的,真正的記事本,退出的時(shí)候可是還有提示的,于是乎,改進(jìn)后的代碼如下;

public void DIYquit(){
 /**
 * 退出函數(shù)退出時(shí)進(jìn)行判斷是否需要保存
 */
 String tips;
 System.out.println(Util.shell.getText().getText());
 if(Util.shell.fileDir != null || Util.shell.getText().getText() != ""){ //文件目錄不為空,說(shuō)明有打開(kāi)著的文件,需要詢(xún)問(wèn)是否保存
 if(Util.shell.fileDir == null){
 tips = "文件 無(wú)標(biāo)題 的文字已經(jīng)改變。\n"+"想保存文件嗎";
 }else{
 tips = "文件 " +Util.shell.fileDir + " 的文字已經(jīng)改變。\n"+"想保存文件嗎";
 }
 int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
 if(n==0){ //是 返回0 否返回1 取消 返回2 
 SaveMethod savemethod = new SaveMethod();
 savemethod.Save(); //點(diǎn)是,則保存文件然后打開(kāi)文件
 }else if(n==1){ //返回否
 System.exit(0);
 }else if(n==2){ //返回取消
 return ;
 }
 System.exit(0);
 }else{ 
 if(Util.shell.getText().getText() != ""){ //若目錄為空,但是內(nèi)容不為空,說(shuō)明有內(nèi)容但未保存,提示之
 tips = "文件 無(wú)標(biāo)題 的文字已經(jīng)改變。\n"+"想保存文件嗎";
 int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
 if(n==0){ //是 返回0 否返回1 取消 返回2 
 SaveMethod savemethod = new SaveMethod();
 savemethod.Save(); //點(diǎn)是,則保存文件然后打開(kāi)文件
 }else if(n==1){ //返回否
 System.exit(0);
 }else if(n==2){ //返回取消
 return ;
 }
 System.exit(0);
 }else{

 }
 }
 System.exit(0);
 }

接下來(lái)的每個(gè)監(jiān)聽(tīng)事件內(nèi)的操作我都定義為了一個(gè)函數(shù),監(jiān)聽(tīng)事件添加方法同第一步,具體實(shí)現(xiàn)方法如下:

2. 添加”另存為” 菜單的監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單將彈出另存為的窗口,實(shí)現(xiàn)將文件另存為別處
這里為了方便代碼的復(fù)用,另存為封裝成方法進(jìn)行調(diào)用
代碼如下:

public void SaveAs(){
 /**
 * 將另存為這個(gè)方法進(jìn)行封裝,方便調(diào)用
 */
 FileDialog dialog = new FileDialog(Util.shell.shell,SWT.SAVE);
 dialog.setFilterPath(System.getProperty("C:\\Documents and Settings"));//設(shè)置打開(kāi)默認(rèn)的路徑
 dialog.setFilterExtensions(new String[] {"*.txt", "*.*"}); //設(shè)置所打開(kāi)文件的擴(kuò)展名
 dialog.setFilterNames( new String[]{"Text Files (*.txt)", "All Files (*.*)"}); //設(shè)置顯示到下拉框中的擴(kuò)展名的名稱(chēng)
 String file = dialog.open();//打開(kāi)窗口,返回用戶(hù)所選的文件目錄
 if(file != null){
 Util.shell.fileDir = file;//將文件目錄保存下來(lái),方面之后的使用
 }
 if ( file != null )
 {
 Util.shell.shell.setText((new File( file.trim())).getName());//獲取文件名(不含路徑)用于設(shè)置title
 FileWriter fileWriter;
 try {
 fileWriter = new FileWriter(file);
 BufferedWriter out = new BufferedWriter(fileWriter);
 out.write(Util.shell.getText().getText());
 out.close();
 fileWriter.close();
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 }
 }

3. 添加”保存” 菜單的監(jiān)聽(tīng)事件

功能描述:觸發(fā)”保存”菜單時(shí),彈出保存文件窗口,然后選擇目錄和輸入文件名進(jìn)行保存
關(guān)于保存這里的邏輯我要好好說(shuō)一說(shuō)了:一開(kāi)始一直在想如何才能確定當(dāng)前文檔是否是保存還是另存為,后來(lái)仔細(xì)觀察桌面記事本才發(fā)現(xiàn),原來(lái)保存和另存為彈出的對(duì)話框是同一個(gè),只需要稍微加以區(qū)別就可判斷是要保存還是要另存為了
判斷如下:若是保存則說(shuō)明存在fileDir,直接調(diào)用保存的函數(shù)即可,若不存在fileDir則說(shuō)明文件時(shí)新打開(kāi)的,還沒(méi)確定過(guò)路徑,因此跳轉(zhuǎn)另存為窗體。
首先定義一個(gè)全局變量String fileDir = null;將其賦值為空,默認(rèn)所有的文件都未保存
接著不管是打開(kāi)文件,還是另存為文件,都將文件所在目錄(包括文件名以及后綴名)記錄在fileDir中,最后在保存事件中確定fileDir是否為空即可。
代碼如下:

 public void Save(){

 /**
 * 保存文件
 */
 if(Util.shell.fileDir!=null ){ //表示該文件有目錄,保存時(shí)直接保存,不需要彈窗
 Util.shell.shell.setText((new File( Util.shell.fileDir.trim())).getName());//獲取文件名(不含路徑)用于設(shè)置title
 FileWriter fileWriter;
 try {
 fileWriter = new FileWriter(Util.shell.fileDir);
 BufferedWriter out = new BufferedWriter(fileWriter);
 out.write(Util.shell.getText().getText());
 out.close();
 fileWriter.close();
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 }
 else{//否則為從未保存過(guò),則調(diào)用另存為窗口
 SaveAs();
 }
 }

4.添加”打開(kāi)” 菜單的監(jiān)聽(tīng)事件

功能描述:觸發(fā)”打開(kāi)”菜單時(shí),彈出打開(kāi)文件窗口,然后選擇文件進(jìn)行打開(kāi)
為了實(shí)現(xiàn)代碼的復(fù)用,將打開(kāi)方法進(jìn)行封裝成函數(shù)
代碼如下:

public void OpenFile(){
 if(Util.shell.fileDir != null || Util.shell.getText().getText() != ""){
 String tips = "文件 " +Util.shell.fileDir + " 的文字已經(jīng)改變。\n"+"想保存文件嗎";
 int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
 if(n==0){ //是 返回0 否返回1 取消 返回2 
 SaveMethod savemethod = new SaveMethod();
 savemethod.Save(); //點(diǎn)是,則保存文件然后打開(kāi)文件
 }else if(n==1){ //返回否

 }else if(n==2){ //返回取消
 return ;
 }
 }else{
 FileDialog dialog = new FileDialog(Util.shell.shell,SWT.OPEN);
 dialog.setFilterPath(System.getProperty("C:\\Documents and Settings"));//設(shè)置打開(kāi)默認(rèn)的路徑
 dialog.setFilterExtensions(new String[] {"*.txt", "*.*"});//設(shè)置所打開(kāi)文件的擴(kuò)展名
 dialog.setFilterNames( new String[]{"Text Files (*.txt)", "All Files (*.*)"});//設(shè)置顯示到下拉框中的擴(kuò)展名的名稱(chēng)
 String file = dialog.open();//打開(kāi)窗口,返回用戶(hù)所選的文件目錄(包括文件名)
 if(file == null){
 return ;
 }
 Util.shell.fileDir = file;
 Util.shell.shell.setText((new File( file.trim())).getName());//獲取文件名(不含路徑)用于設(shè)置title
 FileReader filereader;
 try {
 filereader = new FileReader(file);
 BufferedReader in = new BufferedReader(filereader);
 String s = null;
 Util.shell.getText().setText(""); //將編輯框內(nèi)容制空
 try {
 while((s=in.readLine())!=null){
 Util.shell.getText().append(s+"\n");
 }
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 } catch (FileNotFoundException e2) {
 e2.printStackTrace();
 }
 }
 }

5. 添加”新建” 菜單的監(jiān)聽(tīng)事件

功能描述:觸發(fā)事件時(shí),實(shí)現(xiàn)新建一個(gè)窗口,若當(dāng)前文件未保存,提示其保存,否則跳轉(zhuǎn)產(chǎn)生新頁(yè)面。
產(chǎn)生新頁(yè)面的原理:將title重新初始化,將fileDir初始化,以及把編輯域初始化即可
這里將打開(kāi)新文件的代碼抽出為一個(gè)方法,方便調(diào)用
代碼如下:

void openNewFile() {

 if(Util.shell.fileDir != null || Util.shell.getText().getText() != ""){
 String tips = "文件 " +Util.shell.fileDir + " 的文字已經(jīng)改變。\n"+"想保存文件嗎";
 int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
 if(n==0){ //是 返回0 否返回1 取消 返回2 
 SaveMethod savemethod = new SaveMethod(); //點(diǎn)是,則保存文件然后打開(kāi)文件
 }else if(n==1){ //返回否

 }else if(n==2){ //返回取消
 return ;
 }
 String t = "無(wú)標(biāo)題(" + ++Util.shell.cnt + ") - 記事本";
 Util.shell.shell.setText(t); //設(shè)置標(biāo)題
 Util.shell.getText().setText(""); //清空編輯框
 Util.shell.fileDir = null; 
 }else{
 String t = "無(wú)標(biāo)題(" + ++Util.shell.cnt + ") - 記事本";
 Util.shell.shell.setText(t); //設(shè)置標(biāo)題
 Util.shell.getText().setText(""); //清空編輯框
 Util.shell.fileDir = null; 
 }
 //所有的數(shù)據(jù)都初始化
 }

四.添加事件監(jiān)聽(tīng)函數(shù)(2)編輯類(lèi)

為每個(gè)菜單添加事件監(jiān)聽(tīng)函數(shù)

1.添加”顯示時(shí)間”菜單的監(jiān)聽(tīng)事件

功能描述:事件觸發(fā)時(shí),會(huì)在編輯框中光標(biāo)所在處顯示系統(tǒng)當(dāng)時(shí)時(shí)間
實(shí)現(xiàn):獲取當(dāng)前系統(tǒng)時(shí)間,將其轉(zhuǎn)換成String型,再調(diào)用text.append(str)方法,將時(shí)間顯示在編輯框光標(biāo)之后
1.1添加事件監(jiān)聽(tīng)函數(shù)
獲取系統(tǒng)當(dāng)前時(shí)間方法:調(diào)用SimpleDateFormat對(duì)象格式化時(shí)間,再調(diào)用Date獲取時(shí)間。
剛開(kāi)始存在的問(wèn)題:每次都只能添加到內(nèi)容結(jié)尾,仔細(xì)一想,必須要定位到當(dāng)前光標(biāo)所在位置,再將光標(biāo)前的字符串+時(shí)間字符串+光標(biāo)后的字符串 進(jìn)行拼接,再一起顯示出來(lái)。
找了好久找到了getCaretPosition()剛好返回類(lèi)型為整形,應(yīng)該就是獲取當(dāng)前光標(biāo)位置的,一試果然如此。接下來(lái)便是要實(shí)現(xiàn)字符串的拼接技術(shù)
字符串拼接:s1.substring(0, index) + s2 + s1.substring(index, s1.length());
返回的為新的字符串。
出現(xiàn)的問(wèn)題:拼接好后直接輸出,導(dǎo)致之前存在的內(nèi)容與后來(lái)新的字符串又一次拼接,改了好久才發(fā)現(xiàn)需要調(diào)用setText(String)方法,在輸出之前先將之前編輯框中顯示的內(nèi)容清空
最終監(jiān)聽(tīng)函數(shù)內(nèi)容如下:

 showDate.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"時(shí)間日期"菜單的監(jiān)聽(tīng)事件
 * 功能描述:觸發(fā)該菜單將當(dāng)前系統(tǒng)時(shí)間添加到編輯框光標(biāo)結(jié)尾處
 */
 public void widgetSelected(SelectionEvent e) {
 int index = getText().getCaretPosition(); //獲取當(dāng)前編輯框中光標(biāo)的位置
 //System.out.println(index);
 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設(shè)置日期格式
 String localTime = df.format(new Date());
 String newString = insertString(getText().getText(),localTime,index); //拼接好后的字符串
 getText().setText("");//將原來(lái)編輯框的內(nèi)容清空再將新的內(nèi)容顯示出來(lái)
 //System.out.println(localTime);// new Date()為獲取當(dāng)前系統(tǒng)時(shí)間
 getText().append(newString); //將拼接好的字符串顯示出來(lái)
 }
 });

其中拼接字符串函數(shù)如下:

public String insertString(String s1,String s2,int index){
 /**
 * 實(shí)現(xiàn)字符串的插入函數(shù)
 * 傳入的三個(gè)參數(shù)為:原串,要插入的串,以及插入的位置
 * 返回的為插入后的字符串
 */
 return s1.substring(0, index) + s2 + s1.substring(index, s1.length());
 }

2.添加”全選”菜單監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單將全部選定文本域字符串
Java里面的編輯框竟然自帶全選功能,哈哈,可以直接text.selectAll()調(diào)用,那估計(jì)復(fù)制和粘貼也有現(xiàn)成的,差點(diǎn)忘了,全選后還需判斷所選內(nèi)容是否為空,不為空則需將”刪除” “剪切”這兩個(gè)按鈕設(shè)置成可選
全選代碼如下:

selectAll.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"全選"菜單的監(jiān)聽(tīng)事件
 * 功能描述:觸發(fā)該菜單將全部選中文本域的文字,同時(shí)將"刪除" "剪切"這兩個(gè)按鈕設(shè)置成可選
 */
 public void widgetSelected(SelectionEvent e) {
 getText().selectAll(); //直接調(diào)用自帶的函數(shù)喲
 if(getText().getText() !=null){ //若內(nèi)容不為空,說(shuō)明全選有內(nèi)容,因此需要將"刪除" "剪切" "復(fù)制"這三個(gè)按鈕設(shè)置成可選
 delete.setEnabled(true); //將復(fù)制
 cut.setEnabled(true);
 copy.setEnabled(true);
 }
 }
 });

3.添加”剪切”菜單監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單,實(shí)現(xiàn)選擇內(nèi)容的剪切
直接調(diào)用編輯框的cut()方法
代碼如下:

cut.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"剪切"菜單的監(jiān)聽(tīng)事件
 * 功能描述:觸發(fā)該菜單將選中的字符串進(jìn)行剪切
 */
 public void widgetSelected(SelectionEvent e) {
 getText().cut();
 }
 });

4.添加”粘貼”菜單監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單,實(shí)現(xiàn)將剪切板內(nèi)容進(jìn)行粘貼
直接調(diào)用編輯框的paste()方法
代碼如下:

paste.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"粘貼"菜單的監(jiān)聽(tīng)事件
 * 功能描述:觸發(fā)該菜單將剪切板中的內(nèi)容粘貼到編輯框中
 */
 public void widgetSelected(SelectionEvent e) {
 getText().paste();
 }
 });

5.添加”復(fù)制”菜單監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單,實(shí)現(xiàn)將選擇內(nèi)容進(jìn)行復(fù)制
直接調(diào)用編輯框的copy()方法
代碼如下:

copy.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"剪切"菜單的監(jiān)聽(tīng)事件
 * 功能描述:觸發(fā)該菜單將選中的字符串進(jìn)行剪切
 */
 public void widgetSelected(SelectionEvent e) {
 text.copy ();
 }

6.添加”撤銷(xiāo)”菜單監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單,撤銷(xiāo)當(dāng)前步操作
撤銷(xiāo)該功能涉及到的算法優(yōu)點(diǎn)復(fù)雜,暫時(shí)該記事本不支持按鈕的撤銷(xiāo)方法,但是支持右鍵的撤銷(xiāo)(右鍵的撤銷(xiāo)時(shí)Java Text組件自帶的,又不是我寫(xiě)的,哈哈)

7.添加”查找”菜單監(jiān)聽(tīng)事件

功能描述:觸發(fā)該菜單,執(zhí)行查找操作

 find.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加查找功能的對(duì)話框,其中需要點(diǎn)擊查找,然后彈出一個(gè)對(duì)話框,輸入查找的相關(guān)內(nèi)容
 */
 public void widgetSelected(SelectionEvent e) {
 FindWindow fw = new FindWindow(shell,SWT.DIALOG_TRIM);
 fw.open();
 } 
 });

四.添加事件監(jiān)聽(tīng)函數(shù)(3)輔助類(lèi)

除了菜單欄的幾個(gè)菜單事件外,還需要監(jiān)聽(tīng)鍵盤(pán)事件,即若有鍵盤(pán)鍵入文本域,則會(huì)觸發(fā)相關(guān)菜單的顯示:撤銷(xiāo),查找,查找下一處,替換 這四個(gè)菜單設(shè)置成可選

1.文本域的監(jiān)聽(tīng)

 getText().addKeyListener(new KeyAdapter() {
 /**
 * 設(shè)置鍵盤(pán)監(jiān)聽(tīng)事件
 * 有鍵盤(pán)鍵入則需要把相關(guān)按鈕設(shè)置成可見(jiàn):撤銷(xiāo),查找,查找下一處
 */
 public void keyReleased(KeyEvent e) {
 if(getText().getText()!=""){//說(shuō)明有輸入
 find.setEnabled(true);
 find_next.setEnabled(true);
 replace.setEnabled(true);
 }else{
 find.setEnabled(false);
 find_next.setEnabled(false);
 replace.setEnabled(true);
 }
 }
 });

2.實(shí)現(xiàn)”字體”菜單的事件監(jiān)聽(tīng)函數(shù)

代碼如下:

setFont.addSelectionListener(new SelectionAdapter() {
 /**
 * 設(shè)置字體的監(jiān)聽(tīng)事件
 */
 public void widgetSelected(SelectionEvent e) {
 FontDialog fontDialog = new FontDialog(shell, SWT.NONE);
 Font oldFont = getText().getFont();
 if(oldFont != null) {
 fontDialog.setFontList(oldFont.getFontData());
 }
 FontData fontData = fontDialog.open();
 if(fontData == null) {
 return;
 }
 final Display display = Display.getDefault();
 Font newFont = new Font(display, fontData);
 getText().setFont(newFont);
 if(oldFont != null) {
 oldFont.dispose();
 }
 }
 });

五.窗體標(biāo)簽設(shè)置

將主函數(shù)提取到test類(lèi),并將記事本的窗體的標(biāo)題參數(shù)化,在主函數(shù)中傳入一個(gè)初始標(biāo)簽:”無(wú)標(biāo)題 – 記事本”
在窗體類(lèi)Main_Window中定義有參構(gòu)造方法,傳入的參數(shù)即為標(biāo)題名
構(gòu)造函數(shù)如下:

 Main_Window(String titleName){
 /**
 * 有參構(gòu)造傳入的參數(shù)為文件名
 */
 this.titleName = titleName;
 }

注意的是:剛開(kāi)始運(yùn)行軟件 標(biāo)題為: 無(wú)標(biāo)題 – 記事本
打開(kāi)文件時(shí) 標(biāo)題為所打開(kāi)的文件名
保存時(shí) 標(biāo)題為所保存的文件名
另存為時(shí) 標(biāo)題為另存為的文件名
已知路徑獲取文件名(不包含路徑)的方法為:
shlNotepad.setText((new File( fileDir.trim())).getName());//獲取文件名(不含路徑)用于設(shè)置title
這里為了簡(jiǎn)潔我已經(jīng)將其縮寫(xiě)成一句話代碼

設(shè)置了程序圖標(biāo),將其放在工程目錄下,即可直接引入使用

思考:提示用戶(hù)是否保存時(shí),不能用僅僅看路徑是否為空,應(yīng)該要檢測(cè)鍵盤(pán)是否有按下,即是否有改變,以及內(nèi)容是否有改變(有可能直接右鍵刪除,并未經(jīng)過(guò)鍵盤(pán))

六.其他三個(gè)Dialog對(duì)話框的定義

1.查找對(duì)話框

同樣右鍵新建好的包 new->other ->WindowBuilder->SWT Designer -> SWT ->Dialog命名為FindWindow
成果圖如下:

這里查找,替換,以及查找下一處都共用這一個(gè)窗口。查找內(nèi)容編輯框有內(nèi)容方可觸發(fā)按鈕可點(diǎn)擊,查找內(nèi)容編輯框與替換為編輯框同時(shí)不為空方可觸發(fā)替換功能
這里列出查找下一處以及替換為的方法體
查找下一處:
思路:先獲取主窗口中所有字符串,再獲取需要查找的內(nèi)容,直接調(diào)用Java 自帶的查找字符串函數(shù)獲得起始索引,再加上查找內(nèi)容的字符串長(zhǎng)度即為需要渲染的字符串長(zhǎng)度,再調(diào)用主窗口中的渲染函數(shù),將字符串進(jìn)行渲染再顯示出來(lái)。
具體代碼如下:

find_next.addSelectionListener(new SelectionAdapter() {
 @Override
 public void widgetSelected(SelectionEvent e) {
 pareStr = Util.shell.getText_1(); //獲取主窗口文本框內(nèi)容 true
 index = pareStr.indexOf(textContent.getText(),index); //獲取查找串在母串中的從index處開(kāi)始的位置
 if(index == -1){
 JOptionPane.showMessageDialog(null, "找不到\""+textContent.getText()+"\"","記事本", JOptionPane.ERROR_MESSAGE); 
 }
 int end = index+textContent.getText().length();//獲得渲染的結(jié)束位置
 Util.shell.selectContent(index, end);
 index = index+textContent.getText().length(); 
 }
 });

替換按鈕觸發(fā)事件如下;

replaceBtn.addSelectionListener(new SelectionAdapter() {
 /**
 * 替換按鈕事件
 */
 public void widgetSelected(SelectionEvent e) {
 pareStr = Util.shell.getText_1(); //獲取主窗口文本框內(nèi)容 
 pareStr = pareStr.replaceFirst(textContent.getText(), replaceText.getText());
 Util.shell.showText(pareStr);
 }
 });

2.AboutAuthor對(duì)話框的建立

該對(duì)話框的創(chuàng)建同查找對(duì)話框,將其命名為AboutAuthor即可
具體效果圖如下:

該對(duì)話框未涉及相關(guān)算法,添加三個(gè)JLabel標(biāo)簽然后輸入三句話而已

3.Go_to對(duì)話框的建立

對(duì)話框建立方法不多說(shuō),命名為Go_to即可
具體效果圖如下:

代碼實(shí)現(xiàn)如下:

queding.addSelectionListener(new SelectionAdapter() {
 /**
 * 確定跳轉(zhuǎn)到某行
 */
 public void widgetSelected(SelectionEvent e) {
 int n = Integer.parseInt(goto_line.getText());
 goto_line.setText(""+ n + "");
 Util.shell.gotoOneLine(1);
 }
 });

調(diào)用主窗口中的gotoOneLine()方法

 public void gotoOneLine(int row)
 {
 getText().setSelection(row);
 }

至此,整個(gè)記事本的一般功能已全部完成

七.總結(jié)

從剛開(kāi)始編寫(xiě),到最終的完成,花了大概2-3天,其中學(xué)到了很多相關(guān)的算法,Java編程很方便,許多方法都不需要自己再去實(shí)現(xiàn),直接調(diào)用即可,但是Java也存在很多不足,比如,關(guān)閉窗口的方法我用的Java自帶的對(duì)話框,結(jié)果特別卡,各位感興趣的可以自定義退出的對(duì)話框,只需將自帶的三選對(duì)話框改成自定義的對(duì)話框即可。同時(shí),前只是出于學(xué)習(xí),并未考慮到算法發(fā)高效性,比如打開(kāi)文件操作,只是實(shí)現(xiàn)了功能,但并未考慮算法的時(shí)效性,本例使用的方法是按行讀取文件,你可以自己試試打開(kāi)一個(gè)上千行的文本文檔,你就能感覺(jué)得到算法的重要性,還有就是 向上查找并未實(shí)現(xiàn),初步思路:找到需要查找的坐標(biāo)找到,然后從查找的坐標(biāo)的位置開(kāi)始往回走,將查找內(nèi)容也倒置,再調(diào)用Java自帶的字符串查找函數(shù),
例如:
母串為 “ab記事本def3g” 需要從”3”這個(gè)字符串開(kāi)始向前查找”記事本”字符串,可將母串中”3”字符串所在位置之前的字符串”ab記事本def”完全倒置為”g3fed本事記ba” 將查找內(nèi)容也倒置成”本事記” 再調(diào)用Java內(nèi)帶的字符串查找函數(shù)查找所在位置,再還原即可。

以上就是手把手編寫(xiě)記事本的詳細(xì)步驟,Java基于SWT插件編寫(xiě)桌面記事本應(yīng)用程序,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • java實(shí)現(xiàn)發(fā)送郵件的示例代碼

    java實(shí)現(xiàn)發(fā)送郵件的示例代碼

    這篇文章主要介紹了java如何實(shí)現(xiàn)發(fā)送郵件,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java并發(fā)編程之阻塞隊(duì)列深入詳解

    Java并發(fā)編程之阻塞隊(duì)列深入詳解

    這篇文章主要介紹了詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理,阻塞隊(duì)列是Java util.concurrent包下重要的數(shù)據(jù)結(jié)構(gòu),是一種特殊的隊(duì)列,需要的朋友可以參考下
    2021-10-10
  • Java Swing實(shí)現(xiàn)簡(jiǎn)單的體重指數(shù)(BMI)計(jì)算器功能示例

    Java Swing實(shí)現(xiàn)簡(jiǎn)單的體重指數(shù)(BMI)計(jì)算器功能示例

    這篇文章主要介紹了Java Swing實(shí)現(xiàn)簡(jiǎn)單的體重指數(shù)(BMI)計(jì)算器功能,涉及Java Swing窗口組件布局、響應(yīng)及數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 深入探討Java內(nèi)存區(qū)域

    深入探討Java內(nèi)存區(qū)域

    本篇文章對(duì)Java內(nèi)存區(qū)域的使用進(jìn)行了詳細(xì)的介紹,內(nèi)容很全面,需要的朋友可以參考下
    2015-07-07
  • SpringBoot war包部署到Tomcat服務(wù)器

    SpringBoot war包部署到Tomcat服務(wù)器

    這篇文章主要介紹了SpringBoot war包部署到Tomcat服務(wù)器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過(guò)程詳解

    Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過(guò)程詳解

    這篇文章主要介紹了Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • IDEA2020.2.3

    IDEA2020.2.3 "reading maven projects"卡住的問(wèn)題

    這篇文章主要介紹了IDEA2020.2.3 "reading maven projects"卡住的問(wèn)題及問(wèn)題原因探究,通過(guò)多種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-10-10
  • 深入了解Java GC的工作原理

    深入了解Java GC的工作原理

    下面小編就為大家?guī)?lái)一篇深入了解Java GC的工作原理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Spring?Security實(shí)現(xiàn)分布式系統(tǒng)授權(quán)方案詳解

    Spring?Security實(shí)現(xiàn)分布式系統(tǒng)授權(quán)方案詳解

    這篇文章主要介紹了Spring?Security實(shí)現(xiàn)分布式系統(tǒng)授權(quán),本節(jié)完成注冊(cè)中心的搭建,注冊(cè)中心采用Eureka,本文通過(guò)示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 基于idea Maven中的redis配置使用詳解

    基于idea Maven中的redis配置使用詳解

    這篇文章主要介紹了基于idea Maven中的redis配置使用,包括一些配置文件需要的內(nèi)容,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07

最新評(píng)論