国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java運用SWT插件編寫桌面記事本應用程序

Java運用SWT插件編寫桌面記事本應用程序

2020-03-23 12:33chance2015 JAVA教程

這篇文章主要為大家介紹了一個Java項目實戰,一步步教你實現記事本,步驟很詳細,運用SWT插件手把手編寫記事本,感興趣的小伙伴們可以參考一下

本文實例介紹了Java基于SWT編寫記事本的詳細過程,分享給大家供大家參考,具體內容如下

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

Java運用SWT插件編寫桌面記事本應用程序

應用程序功能介紹:

功能分析:

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

其中文件菜單中包括

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

其中編輯菜單中包括:

2.1撤銷(U) Ctrl+Z
2.2剪切(T) Ctrl+T
2.3復制(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轉到(G) Ctrl+G
2.10全選(A) Ctrl+A
2.11時間/日期(D) F5

其中格式菜單中包括

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

其中查看菜單中包括

4.1狀態欄(S)

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

編寫步驟:

一.新建SWT項目以及第一個窗口的創建

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

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

二.設置菜單欄的相關標簽以及窗體總體布局

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

1.設置第一個菜單項(文件)

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

2.設置第二個菜單項(編輯)

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

3.設置第三個菜單項(格式)

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

4.設置第四個菜單項(查看)

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

5.設置第五個菜單項(幫助)

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

Java運用SWT插件編寫桌面記事本應用程序

接下來實現各個功能

三.設置菜單快捷鍵

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
new_file.setAccelerator(SWT.CTRL + 'N'); //新建文件快捷鍵
open_file.setAccelerator(SWT.CTRL + 'O');//保存文件快捷鍵
undo.setAccelerator(SWT.CTRL + 'Z'); //撤銷快捷鍵
cut.setAccelerator(SWT.CTRL + 'T'); //剪切快捷鍵
copy.setAccelerator(SWT.CTRL + 'C'); //復制快捷鍵
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'); //轉到快捷鍵
selectAll.setAccelerator(SWT.CTRL + 'A');//全選快捷鍵
showDate.setAccelerator(SWT.F5);  //顯示時間快捷鍵

四.添加事件監聽函數(1)文件類

為文件每個菜單添加事件監聽函數

1.添加”退出” 菜單的監聽事件

功能描述:觸發該菜單將退出應用程序
退出的實現比較簡單,調用系統函數System.exit(0);即可
在design模式下點擊”時間/日期(F5)”組件 再點擊”Show event”->selection->雙擊widgetSelected
事件代碼如下:

?
1
2
3
4
5
6
7
8
9
quit.addSelectionListener(new SelectionAdapter() {
  /**
  * 添加"退出"菜單的監聽事件
  * 功能描述:觸發該菜單將退出應用程序
  */
  public void widgetSelected(SelectionEvent e) {
  System.exit(0);
  }
 });

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public void DIYquit(){
 /**
  * 退出函數退出時進行判斷是否需要保存
  */
 String tips;
 System.out.println(Util.shell.getText().getText());
 if(Util.shell.fileDir != null || Util.shell.getText().getText() != ""){ //文件目錄不為空,說明有打開著的文件,需要詢問是否保存
  if(Util.shell.fileDir == null){
  tips = "文件 無標題 的文字已經改變。\n"+"想保存文件嗎";
  }else{
  tips = "文件 " +Util.shell.fileDir + " 的文字已經改變。\n"+"想保存文件嗎";
  }
  int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
  if(n==0){ //是 返回0 否返回1 取消 返回2
  SaveMethod savemethod = new SaveMethod();
  savemethod.Save(); //點是,則保存文件然后打開文件
  }else if(n==1){ //返回否
  System.exit(0);
  }else if(n==2){ //返回取消
  return ;
  }
  System.exit(0);
 }else{
  if(Util.shell.getText().getText() != ""){ //若目錄為空,但是內容不為空,說明有內容但未保存,提示之
  tips = "文件 無標題 的文字已經改變。\n"+"想保存文件嗎";
  int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
  if(n==0){ //是 返回0 否返回1 取消 返回2
   SaveMethod savemethod = new SaveMethod();
   savemethod.Save(); //點是,則保存文件然后打開文件
  }else if(n==1){ //返回否
   System.exit(0);
  }else if(n==2){ //返回取消
   return ;
  }
  System.exit(0);
  }else{
 
  }
 }
 System.exit(0);
 }

接下來的每個監聽事件內的操作我都定義為了一個函數,監聽事件添加方法同第一步,具體實現方法如下:

2. 添加”另存為” 菜單的監聽事件

功能描述:觸發該菜單將彈出另存為的窗口,實現將文件另存為別處
這里為了方便代碼的復用,另存為封裝成方法進行調用
代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void SaveAs(){
 /**
  * 將另存為這個方法進行封裝,方便調用
  */
 FileDialog dialog = new FileDialog(Util.shell.shell,SWT.SAVE);
  dialog.setFilterPath(System.getProperty("C:\\Documents and Settings"));//設置打開默認的路徑
  dialog.setFilterExtensions(new String[] {"*.txt", "*.*"}); //設置所打開文件的擴展名
  dialog.setFilterNames( new String[]{"Text Files (*.txt)", "All Files (*.*)"}); //設置顯示到下拉框中的擴展名的名稱
  String file = dialog.open();//打開窗口,返回用戶所選的文件目錄
  if(file != null){
  Util.shell.fileDir = file;//將文件目錄保存下來,方面之后的使用
  }
  if ( file != null )
  {
  Util.shell.shell.setText((new File( file.trim())).getName());//獲取文件名(不含路徑)用于設置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. 添加”保存” 菜單的監聽事件

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void Save(){
 
/**
 * 保存文件
 */
if(Util.shell.fileDir!=null ){ //表示該文件有目錄,保存時直接保存,不需要彈窗
 Util.shell.shell.setText((new File( Util.shell.fileDir.trim())).getName());//獲取文件名(不含路徑)用于設置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{//否則為從未保存過,則調用另存為窗口
 SaveAs();
}
}

4.添加”打開” 菜單的監聽事件

功能描述:觸發”打開”菜單時,彈出打開文件窗口,然后選擇文件進行打開
為了實現代碼的復用,將打開方法進行封裝成函數
代碼如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public void OpenFile(){
 if(Util.shell.fileDir != null || Util.shell.getText().getText() != ""){
  String tips = "文件 " +Util.shell.fileDir + " 的文字已經改變。\n"+"想保存文件嗎";
  int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
  if(n==0){ //是 返回0 否返回1 取消 返回2
  SaveMethod savemethod = new SaveMethod();
  savemethod.Save(); //點是,則保存文件然后打開文件
  }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"));//設置打開默認的路徑
  dialog.setFilterExtensions(new String[] {"*.txt", "*.*"});//設置所打開文件的擴展名
  dialog.setFilterNames( new String[]{"Text Files (*.txt)", "All Files (*.*)"});//設置顯示到下拉框中的擴展名的名稱
  String file = dialog.open();//打開窗口,返回用戶所選的文件目錄(包括文件名)
  if(file == null){
   return ;
  }
  Util.shell.fileDir = file;
  Util.shell.shell.setText((new File( file.trim())).getName());//獲取文件名(不含路徑)用于設置title
  FileReader filereader;
  try {
  filereader = new FileReader(file);
  BufferedReader in = new BufferedReader(filereader);
  String s = null;
  Util.shell.getText().setText(""); //將編輯框內容制空
   try {
   while((s=in.readLine())!=null){
    Util.shell.getText().append(s+"\n");
   }
   } catch (IOException e1) {
   e1.printStackTrace();
   }
  } catch (FileNotFoundException e2) {
  e2.printStackTrace();
  }
 }
 }

5. 添加”新建” 菜單的監聽事件

功能描述:觸發事件時,實現新建一個窗口,若當前文件未保存,提示其保存,否則跳轉產生新頁面。
產生新頁面的原理:將title重新初始化,將fileDir初始化,以及把編輯域初始化即可
這里將打開新文件的代碼抽出為一個方法,方便調用
代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void openNewFile() {
 
 if(Util.shell.fileDir != null || Util.shell.getText().getText() != ""){
  String tips = "文件 " +Util.shell.fileDir + " 的文字已經改變。\n"+"想保存文件嗎";
  int n=JOptionPane.showConfirmDialog(null, tips,"記事本",JOptionPane.YES_NO_CANCEL_OPTION);
  if(n==0){ //是 返回0 否返回1 取消 返回2
  SaveMethod savemethod = new SaveMethod(); //點是,則保存文件然后打開文件
  }else if(n==1){ //返回否
 
  }else if(n==2){ //返回取消
  return ;
  }
  String t = "無標題(" + ++Util.shell.cnt + ") - 記事本";
  Util.shell.shell.setText(t); //設置標題
  Util.shell.getText().setText("");   //清空編輯框
  Util.shell.fileDir = null;
 }else{
  String t = "無標題(" + ++Util.shell.cnt + ") - 記事本";
  Util.shell.shell.setText(t); //設置標題
  Util.shell.getText().setText("");   //清空編輯框
  Util.shell.fileDir = null;
 }
   //所有的數據都初始化
 }

四.添加事件監聽函數(2)編輯類

為每個菜單添加事件監聽函數

1.添加”顯示時間”菜單的監聽事件

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
showDate.addSelectionListener(new SelectionAdapter() {
 /**
 * 添加"時間日期"菜單的監聽事件
 * 功能描述:觸發該菜單將當前系統時間添加到編輯框光標結尾處
 */
 public void widgetSelected(SelectionEvent e) {
 int index = getText().getCaretPosition(); //獲取當前編輯框中光標的位置
 //System.out.println(index);
 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
 String localTime = df.format(new Date());
 String newString = insertString(getText().getText(),localTime,index); //拼接好后的字符串
 getText().setText("");//將原來編輯框的內容清空再將新的內容顯示出來
 //System.out.println(localTime);// new Date()為獲取當前系統時間
 getText().append(newString); //將拼接好的字符串顯示出來
 }
});

其中拼接字符串函數如下:

?
1
2
3
4
5
6
7
8
public String insertString(String s1,String s2,int index){
 /**
  * 實現字符串的插入函數
  * 傳入的三個參數為:原串,要插入的串,以及插入的位置
  * 返回的為插入后的字符串
  */
 return s1.substring(0, index) + s2 + s1.substring(index, s1.length());
 }

2.添加”全選”菜單監聽事件

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
selectAll.addSelectionListener(new SelectionAdapter() {
  /**
   * 添加"全選"菜單的監聽事件
   * 功能描述:觸發該菜單將全部選中文本域的文字,同時將"刪除" "剪切"這兩個按鈕設置成可選
   */
  public void widgetSelected(SelectionEvent e) {
   getText().selectAll(); //直接調用自帶的函數喲
   if(getText().getText() !=null){ //若內容不為空,說明全選有內容,因此需要將"刪除" "剪切" "復制"這三個按鈕設置成可選
   delete.setEnabled(true); //將復制
   cut.setEnabled(true);
   copy.setEnabled(true);
   }
  }
  });

3.添加”剪切”菜單監聽事件

功能描述:觸發該菜單,實現選擇內容的剪切
直接調用編輯框的cut()方法
代碼如下:

?
1
2
3
4
5
6
7
8
9
cut.addSelectionListener(new SelectionAdapter() {
  /**
   * 添加"剪切"菜單的監聽事件
   * 功能描述:觸發該菜單將選中的字符串進行剪切
   */
  public void widgetSelected(SelectionEvent e) {
   getText().cut();
  }
  });

4.添加”粘貼”菜單監聽事件

功能描述:觸發該菜單,實現將剪切板內容進行粘貼
直接調用編輯框的paste()方法
代碼如下:

?
1
2
3
4
5
6
7
8
9
paste.addSelectionListener(new SelectionAdapter() {
  /**
   * 添加"粘貼"菜單的監聽事件
   * 功能描述:觸發該菜單將剪切板中的內容粘貼到編輯框中
   */
  public void widgetSelected(SelectionEvent e) {
   getText().paste();
  }
  });

5.添加”復制”菜單監聽事件

功能描述:觸發該菜單,實現將選擇內容進行復制
直接調用編輯框的copy()方法
代碼如下:

?
1
2
3
4
5
6
7
8
copy.addSelectionListener(new SelectionAdapter() {
  /**
  * 添加"剪切"菜單的監聽事件
  * 功能描述:觸發該菜單將選中的字符串進行剪切
  */
  public void widgetSelected(SelectionEvent e) {
  text.copy ();
  }

6.添加”撤銷”菜單監聽事件

功能描述:觸發該菜單,撤銷當前步操作
撤銷該功能涉及到的算法優點復雜,暫時該記事本不支持按鈕的撤銷方法,但是支持右鍵的撤銷(右鍵的撤銷時Java Text組件自帶的,又不是我寫的,哈哈)

7.添加”查找”菜單監聽事件

功能描述:觸發該菜單,執行查找操作

?
1
2
3
4
5
6
7
8
9
find.addSelectionListener(new SelectionAdapter() {
 /**
  * 添加查找功能的對話框,其中需要點擊查找,然后彈出一個對話框,輸入查找的相關內容
  */
 public void widgetSelected(SelectionEvent e) {
  FindWindow fw = new FindWindow(shell,SWT.DIALOG_TRIM);
  fw.open();
 }
 });

四.添加事件監聽函數(3)輔助類

除了菜單欄的幾個菜單事件外,還需要監聽鍵盤事件,即若有鍵盤鍵入文本域,則會觸發相關菜單的顯示:撤銷,查找,查找下一處,替換 這四個菜單設置成可選

1.文本域的監聽

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
getText().addKeyListener(new KeyAdapter() {
 /**
  * 設置鍵盤監聽事件
  * 有鍵盤鍵入則需要把相關按鈕設置成可見:撤銷,查找,查找下一處
  */
 public void keyReleased(KeyEvent e) {
  if(getText().getText()!=""){//說明有輸入
  find.setEnabled(true);
  find_next.setEnabled(true);
  replace.setEnabled(true);
  }else{
  find.setEnabled(false);
  find_next.setEnabled(false);
  replace.setEnabled(true);
  }
 }
 });

2.實現”字體”菜單的事件監聽函數

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
setFont.addSelectionListener(new SelectionAdapter() {
  /**
   * 設置字體的監聽事件
   */
  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();
   }
  }
  });

五.窗體標簽設置

將主函數提取到test類,并將記事本的窗體的標題參數化,在主函數中傳入一個初始標簽:”無標題 – 記事本”
在窗體類Main_Window中定義有參構造方法,傳入的參數即為標題名
構造函數如下:

?
1
2
3
4
5
6
Main_Window(String titleName){
/**
 * 有參構造傳入的參數為文件名
 */
this.titleName = titleName;
}

注意的是:剛開始運行軟件 標題為: 無標題 – 記事本
打開文件時 標題為所打開的文件名
保存時 標題為所保存的文件名
另存為時 標題為另存為的文件名
已知路徑獲取文件名(不包含路徑)的方法為:
shlNotepad.setText((new File( fileDir.trim())).getName());//獲取文件名(不含路徑)用于設置title
這里為了簡潔我已經將其縮寫成一句話代碼

設置了程序圖標,將其放在工程目錄下,即可直接引入使用

思考:提示用戶是否保存時,不能用僅僅看路徑是否為空,應該要檢測鍵盤是否有按下,即是否有改變,以及內容是否有改變(有可能直接右鍵刪除,并未經過鍵盤)

六.其他三個Dialog對話框的定義

1.查找對話框

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

Java運用SWT插件編寫桌面記事本應用程序

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
find_next.addSelectionListener(new SelectionAdapter() {
  @Override
  public void widgetSelected(SelectionEvent e) {
  pareStr = Util.shell.getText_1(); //獲取主窗口文本框內容 true
  index = pareStr.indexOf(textContent.getText(),index); //獲取查找串在母串中的從index處開始的位置
  if(index == -1){
   JOptionPane.showMessageDialog(null, "找不到\""+textContent.getText()+"\"","記事本", JOptionPane.ERROR_MESSAGE);
  }
  int end = index+textContent.getText().length();//獲得渲染的結束位置
  Util.shell.selectContent(index, end);
  index = index+textContent.getText().length();
  }
 });

替換按鈕觸發事件如下;

?
1
2
3
4
5
6
7
8
9
10
replaceBtn.addSelectionListener(new SelectionAdapter() {
  /**
  * 替換按鈕事件
  */
  public void widgetSelected(SelectionEvent e) {
  pareStr = Util.shell.getText_1(); //獲取主窗口文本框內容
  pareStr = pareStr.replaceFirst(textContent.getText(), replaceText.getText());
  Util.shell.showText(pareStr);
  }
 });

2.AboutAuthor對話框的建立

該對話框的創建同查找對話框,將其命名為AboutAuthor即可
具體效果圖如下:

Java運用SWT插件編寫桌面記事本應用程序

該對話框未涉及相關算法,添加三個JLabel標簽然后輸入三句話而已

3.Go_to對話框的建立

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

Java運用SWT插件編寫桌面記事本應用程序

代碼實現如下:

?
1
2
3
4
5
6
7
8
9
10
queding.addSelectionListener(new SelectionAdapter() {
  /**
  * 確定跳轉到某行
  */
  public void widgetSelected(SelectionEvent e) {
  int n = Integer.parseInt(goto_line.getText());
  goto_line.setText(""+ n + "");
  Util.shell.gotoOneLine(1);
  }
 });

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

?
1
2
3
4
public void gotoOneLine(int row)
{
getText().setSelection(row);
}

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

七.總結

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

以上就是手把手編寫記事本的詳細步驟,Java基于SWT插件編寫桌面記事本應用程序,希望對大家的學習有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久草观看| 欧美一级大片 | 色橹橹欧美在线观看视频高清 | 亚洲精品福利 | 亚洲一区二区高清 | 亚洲综合二区 | 久久久久中文字幕 | 99中文字幕 | 色综合一区二区三区 | 久久久久亚洲美女啪啪 | 99精品国产一区二区三区 | 亚洲欧洲av在线 | 日韩成人av电影在线观看 | 日日日日干干干干 | 国产精品免费看 | 久久久国产视频 | 免费一区 | 一级中文字幕 | 91精品免费在线观看 | 日韩欧美在线免费观看 | 成人片网址 | 免费自拍偷拍视频 | 亚洲一区综合 | 韩国精品一区二区三区 | 日韩精品无码一区二区三区 | 一呦二呦三呦国产精品 | 亚洲国产高清美女在线观看 | 中文字幕国产在线视频 | 超碰最新网址 | 91视频观看 | 日韩欧美不卡 | 日本精品一区二 | 精品美女久久久 | 成a人片在线观看 | 久久久久国产一级毛片高清片 | 黄色片视频在线观看免费 | 亚洲视频中文字幕在线观看 | 亚洲精品视频在线看 | 亚洲国产精品自拍 | 国产中文字幕在线免费观看 | 国产一区二区三区视频在线观看 |