張會
摘要:該文利用 Java Swing,輸入輸出流,事件處理等技術實現(xiàn)了一個記事本小程序。記事本具有新建,保存,另存為,設置字體,設置顏色及退出等功能。記事本是一個集Java Swing、輸入輸出流、事件處理等知識綜合應用的實例程序。
關鍵詞:輸入輸入出流;事件處理;記事本;Java Swing
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)30-0088-03
Notepad(記事本)是Windows系統(tǒng)中一款小巧的純文本編輯器,常用做源程序編輯器,具有打開速度快,文件小等特點,若只保存為純文本文件最好使用記事本。文中的記事本采用Java Swing, 輸入輸出流、事件處理等相關技術進行設計及開發(fā),使初學者快速掌握及使用Java中的Java Swing、輸入輸出流、事件處理等相關技術進行Java程序開發(fā)有較大幫助,并對《Java程序設計》課程相關知識點的綜合實踐教學具有一定指導作用。
1 記事本設計
1.1 功能設計
記事本能夠實現(xiàn)以下功能:
1) 保存:對于新建文件,單擊保存選項,則彈出保存對話框,實現(xiàn)對記事本中的內容命名并保存;對于已命名文件,單擊保存選項,不會彈出保存對話框,直接實現(xiàn)原名保存。
2) 另存為:實現(xiàn)換名或換位置保存。
3) 打開:實現(xiàn)打開一個純文本文件,如*.txt,*.cpp,*.java等純文本文件。
4) 保存提示:對新建的文件輸入了內容或對打開的文件作了修改并直接退出記事本時,會提示是否保存修改。
5) 設置字體顏色:Windows系統(tǒng)中的記事本,未實現(xiàn)對文本內容設置字體顏色功能,本程序實現(xiàn)了對記事本中的文字設置字體顏色。
6) 設置字體、字形、字號:實現(xiàn)了對文本設置字體、字形、字號功能。
1.2 界面設計
Swing是Java的GUI(圖形用戶界面)工具包,包括了GUI組件,如:菜單欄、菜單項、按鈕、面板、文本框等組件。本設計利用了Swing中的相關組件實現(xiàn)了如圖1,圖2所示的記事本。其中使用JFrame做為頂層窗體容器,在其上添加了JMenuBar(菜單欄),JMenu(記事本菜單)及菜單下的JMenuItem(菜單項)組件,另外在JFrame容器中添加了一個JPanel面板,再在JPanel中添加了一個JTextArea組件,JTextArea對象用來顯示或編輯記事本文件中的內容。
圖1 記事本界面1
圖2 記事本界面2
2 記事功能實現(xiàn)
2.1 記事各功能事件處理實現(xiàn)
本記事本具有打開文件,新建文件,保存、另存為、字體設置、顏色設置等功能,當鼠標單擊這些選項時,將會對應不同的功能操作。這些操作都是通過Java中的事件處理技術實現(xiàn)。當單擊菜單中某菜單選項時,會產生一個ActionEvent事件,然后Java虛擬機檢查是否有與該菜單項相關聯(lián)的事件處理器,事件處理器實質是一個方法,如actionPerformed()方法,如果沒有,不做任何處理;若有則將事件對象傳遞給與之關聯(lián)的事件處理器方法作為事件處理方法參數(shù),并自動調用事件處理方法。Java虛擬機通過傳遞過來的ActionEvent對象,獲得事件發(fā)生時與該事件及事件源相關聯(lián)的信息。Java組件通過形如addXxxListener()的方法添加事件監(jiān)聽器。
一個事件源可以添加多個監(jiān)聽器,而本記事本中的事件源是菜單中的各菜單項,在菜單項上發(fā)生鼠標單擊事件,因此在每個菜單項上添加addActionListener()方法添加事件監(jiān)聽器,并實現(xiàn)事件處理actionPerformed()方法給出具體的功能實現(xiàn)。
為記事本中各菜單項添加事件監(jiān)聽器代碼如下:
newfile.addActionListener(this);
open.addActionListener(this);
save.addActionListener(this);
exit.addActionListener(this);
saveas.addActionListener(this);
fontColor.addActionListener(this);
font.addActionListener(this);
事件處理actionPerformed()方法代碼如下:
public void actionPerformed(ActionEvent e) {
JMenuItem item=(JMenuItem)e.getSource();//獲得事件源
if(item==open){
openFile(); //打開文件
}else if(item==save){
saveFile(); //保存文件
}else if(item==saveas){
saveasFile(); //另存為文件
}else if(item==newfile){
newFile(); //新建文件
}else if(item==exit){
exitNotepad (); //退出記事本
}else if(item==fontColor){
setFontColor(); //字體顏色設置
}else if(item==font){
setFont(); //字體設置
}}
2.2 打開文件
實現(xiàn)記事本的打開功能,實質是把要打開的文件內容讀入到內存再顯示在記事本中。在Java中,是通過流來實現(xiàn)數(shù)據(jù)的輸入輸出。Java中的流有兩種類型,分別是字節(jié)流和字符流,其中字符流只處理文本化的數(shù)據(jù),而本記事本程序讀寫都是文本文件,因此本程序輸入和輸出操作都是針對字符數(shù)據(jù)流操作,而FileReader,F(xiàn)ileWriter是用來讀寫字符流的主要類。因此本程序使用FileReader,F(xiàn)ileWrite兩個類提供的read(),write()方法實現(xiàn)文件打開和保存操作。
打開文件代碼如下:
public void openFile(){
area.setText(null);
fileChooser=new JFileChooser();//創(chuàng)建一個不可見的文件選擇對話框
//顯示文件選擇對話框并確定打開所選擇文件
if(fileChooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){ file=fileChooser.getSelectedFile();
char content[]=new char[30];
int length;
try {reader=new FileReader(file);
while((length=reader.read(content))!=-1){
String str=new String(content, 0, length);
this.textArea.append(str);
}
reader.close();
this.setTitle(file.getName());
oldStr=textArea.getText();
} catch (Exception e) { e.printStackTrace();}
}}
在實現(xiàn)打開功能時,通過JFileChooser類的showOpenDialog()方法顯示打開文件對話框,當選擇了要打開的文件并確認打開操作后,該方法的返回值與JFileChooser.APPROVE_OPTION相等時,使用JFileChooser對象的getSelectedFile()獲得打開文件file對象,再通過FileReader對象與打開的文件關聯(lián),建立輸入流對象reader,通過輸入流對象reader調用read()方法循環(huán)讀入文件內容至content數(shù)組中,再把數(shù)組內容追加在記事本中用于顯示和編輯的textArea組件中。從而達到把要打開的文件內容顯示在記事本中。
2.3 另存為功能
當單擊另存為選項時,通過JFileChooser類的showSaveDialog ()方法來顯示保存文件對話框,當設置了文件保存位置、文件名并確認保存操作后,該方法的返回值與JFileChooser.APPROVE_OPTION相等,使用JFileChooser對象的getSelectedFile()獲得保存文件對象file,再通過FileWriter類對象與保存的文件關聯(lián)建立輸出流對象writer,通過輸出流對象writer調用write()方法將textArea.getText()中需要保存的所有文本內容,寫到輸出流對象writer關聯(lián)的文件中,從而實現(xiàn)文件的另存為功能。
public void saveasFile(){
fileChooser=new JFileChooser();
if(fileChooser.showSaveDialog(this)==JFileChooser.APPROVE_OPTION){
file=fileChooser.getSelectedFile();
String content=textArea.getText();
try {
writer=new FileWriter(file);
writer.write(content);
writer.close();
this.setTitle(file.getName());
oldStr=textArea.getText();
} catch (IOException e) {e.printStackTrace();}
}}
2.4 保存功能
保存功能類似于另存為功能,但其包含兩種情況,第一種情況是文件不存在即指新文件第一次保存時,需要調用上節(jié)所實現(xiàn)的另存為功能對應的saveasFile()方法完成文件位置選擇及文件命名保存;第二種情況是對已存在文件進行保存操作,此時只需要把新增內容寫入原文件中保存即可。
保存功能代碼如下:
public void saveFile(){
if(file!=null){//舊文件保存時,把textArea中的內容直接寫到原文件中即可
String text=textArea.getText();
char content[]=text.toCharArray();endprint
try {
writer=new FileWriter(file);
writer.write(text);
writer.close();
this.setTitle(file.getName());
oldStr=textArea.getText();
} catch (IOException e) { e.printStackTrace();}
}else{
saveasFile();}}//新文件第一次保存,會彈出保存對話框,進行命名
2.5 新建文件功能
只要對文本編輯區(qū)里的內容做了修改,選擇文件菜單下的新建功能時,會提示是否保存文件的修改內容。如果需要保存,則調上節(jié)實現(xiàn)的保存功能對應的saveFile()方法來處理新文件保存或者原名原位置文件保存;如果放棄保存,則直接新建文件。新建文件實質是把file對象置為null,同時把textArea文本區(qū)內容置為null。
新建功能代碼如下:
public void newFile() {
newStr = textArea.getText();
if (?。╫ldStr.trim().equals(newStr.trim()))){//文本有修改,并保存修改
int status = JOptionPane.showConfirmDialog(this, "是否保存文件的修改?", "確認修改", JOptionPane.YES_NO_CANCEL_OPTION);
if (status == JOptionPane.YES_OPTION) {
saveFile();}}
file = null;
textArea.setText(null);
this.setTitle("新建文件");}
2.6 設置字體顏色
本文使用Java類庫所提供的JColorChooser來創(chuàng)建一個顏色選擇器對象,并利用該對象調用showDialog來顯示顏色選擇對話框并返回選擇的Color對象,再通過JTextArea對象的setForeground(color)將記事本的文本區(qū)設置成所選顏色。實現(xiàn)現(xiàn)代碼如下:
public void setFontColor(){
colorChoos=new JColorChooser();
Color color= colorChoos.showDialog(this, "調色板", Color.black);
textArea.setForeground(color);}
2.7 字體設置功能
代碼中的FontChooser是自定義的一個字體選擇器類,用來仿Windows記事本中的字體選擇控件,F(xiàn)ontChooser類的定義和操作與文件選擇器JFileChooser基本相同,由于篇幅關系,F(xiàn)ontChooser類的實現(xiàn)在此不再贅述。利用自定義FontChooser類設置記事本中字形,字號,字體選擇設置代碼如下:
public void setFont(){
FontChooser fontChooser=new FontChooser(textArea.getFont());//構造選擇器對象
int returnValue = fontChooser.showFontDialog(this); // 打開字體選擇器對話框
if (returnValue == FontChooser.APPROVE_OPTION) { //按下確定按鈕
Font font = fontChooser.getSelectFont(); // 獲取選擇的字體
textArea.setFont(font); }} //將textArea中文字設置為選中字體
3 結束語
本記事本通過使用Java Swing呈現(xiàn)出友好的人機交互界面,采用字符輸入輸出流對象實現(xiàn)文件打開,保存功能,采用事件處理技術實現(xiàn)各菜單項相應操作功能,另外通過JColorChooser類及自定義FontChooser類實現(xiàn)了文本字體顏色,字體設置等功能。文中所實現(xiàn)的記事本與Windows系統(tǒng)所提供的記事本功能大致相同,但擴展并實現(xiàn)了Windows記事本沒有的字體顏色設置功能。本程序為Java初學者掌握事件處理,輸入輸出流,Java Swing等知識提供了一個綜合而有用的實例,便于初學者理解及掌握,并且對《Java程序設計》課程教學有一定的參考作用。
參考文獻:
[1] 王振飛,孫嬡.Java語言程序設計[M].廣州: 華南理工大學出版社,2015.
[2] 傳智博客.Java基礎入門[M].北京: 清華大學出版社,2014.
[3] 歐陽桂秀.Java中幾個文件輸入流和文件輸出流的研究[J].福建電腦,2014(10):117-118.
[4] 馬巧梅.基于Java打磚塊游戲的設計與實現(xiàn)[J].信息技術,2016(7):16-19.
[5] 孫佳美.基于Java飛機大戰(zhàn)的設計與實現(xiàn)[J].無線互聯(lián)科技,2016(1):54-55.endprint