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