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