功課這次是加分題,所以同學們擔心考試太差的話,這個功課也要交唷!FileNameFilter這個類別在Java Swing的官方文件也有介紹到,我想各位同學有興趣的話,可以參考:
大概在中間地帶,副標題寫著Filtering the List of Files。必須要宣告一個類別去實作FilenameFilter,必須要去覆寫accept方法,在裡面撰寫自己的商業邏輯。而如果要能夠搜尋副檔名的話,只要透過File的list方法中放入FilenameFilter,就會自動把檔案路徑給予Filter,然後再把檔案中的副檔名擷取出來,進行字串的比較即可。
擷取副檔名可使用String.lastIndexOf(‘.’);
他就會取出一個字串中最後一個小數點的位置(通常最後一個小數點就是副檔名的那一個)。之後再使用String.substring和迴圈去抓出副檔名名稱,如此一來就能成功判斷。
當然我用了比較簡單的方法,String.endsWith(String suffix);
這個方法是取抓字串是以suffix作為結尾,則回傳true或false。但是我上一個講的方法是Java官方公布出來的唷,我想工程師們一定有某種考量才會寫的比較麻煩,而我用的方法也許只能在比較簡單的程式上執行,只能說我還是新手XD不知道他們考量的是什麼。
不好意思,這次執行會沒辦法看見預定的結果,似乎是因為jar檔上傳在伺服器上,所以沒辦法搜尋本機端的資料夾。不過我想這應該也是我技術不足所造成><"如果有另外研究到方法,再寫看看嘍-"-
註:建議大家可以把這個作業做得更方便喔,比方說目錄可以不讓使用者手動輸入,加個dialog讓使用者去選取資料夾,至於要怎麼做就讓大家去查查資料吧。另外使用Label顯示結果也不怎麼好用,要是檔案很多而超出介面範圍怎麼辦?可以試看看用List來做,而且大多數搜尋完後,都要能點兩下直接執行不是嗎?也可以寫看看唷。
執行結果:
底下分享我自己寫的部分,另外也歡迎平時有光顧我網誌的讀者,可以在底下留言自己的寫法。^-^
寫法僅供參考,畢竟Java才學不到一年吧 >”<
(大家記得註解和程式碼要自己重新打過唷,工讀生會檢查;請大家要多多修改唷,尤其在版面的樣子,這是最好改,也是最不容易被老師抓到的地方,請多下點功夫!)
程式碼:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class a11967046 extends JFrame implements ActionListener{
/* 11967046 公版
* 請設計一視窗程式
* 使用Filenamefilter介面(pp. 8-9)
* 包含兩個TextFiled元件、一個Label元件(用於顯示結果)
* 以及一顆按鈕Button。操作模式如下:
* 1.首先輸入完整檔案路徑
* 2.輸入欲尋找副檔名類型
* 3.按下確定顯示所有符合的項目,並列出個數。
*/
//宣告用來輸入檔案路徑與副檔名的TF
JTextField fullFilePath_tf = new JTextField(20);
JTextField extensionFile_tf = new JTextField(14);
//顯示結果和提示用的Label
JLabel result_lb = new JLabel();
JLabel tip_lb = new JLabel();
JLabel tip2_lb = new JLabel();
//搜尋鈕
JButton searchFile_btn = new JButton();
public a11967046(){
super("檔案搜尋程式");
Container contain = this.getContentPane();
JPanel panel = new JPanel();
tip_lb.setText("請先輸入您欲搜尋的檔案資料夾");
tip2_lb.setText("之後再輸入您欲搜尋的副檔名類型");
searchFile_btn.setText("搜尋");
fullFilePath_tf.setText("C:\\Program Files\\");
fullFilePath_tf.selectAll();
extensionFile_tf.setText(".exe");
panel.add(tip_lb);
panel.add(tip2_lb);
panel.add(fullFilePath_tf);
panel.add(extensionFile_tf);
panel.add(searchFile_btn);
panel.add(result_lb);
contain.add(panel);
searchFile_btn.addActionListener(this);
}
public static void main(String[] args) {
a11967046 frame = new a11967046();
frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent event) {
//讀取檔案路徑
File file = new File(fullFilePath_tf.getText());
//type為儲存副檔名類型的變數
String type = extensionFile_tf.getText();
//使用FileNameFilter來篩選檔案
FileFilter filter = new FileFilter(type);
//使用list提供的filter功能
String[] fileArray = file.list(filter);
//輸出搜尋的結果
String result = "<html>搜尋結果為:<br />";
for (String fileName : fileArray){
result += fileName + "<br />";
}
result += "總共有" + fileArray.length +"個檔案"
+"</html>";
result_lb.setText(result);
}
class FileFilter implements FilenameFilter{
String type;
FileFilter(String type){
this.type = type;
}
@Override
public boolean accept(File dir, String name) {
//回傳字串的結尾值是副檔名(如.java)
return name.endsWith(type);
}
}
}

Java Swing 是可以使用HTML語法的唷!所以Label要換行的話,也可以使用這個方法。原本程式碼第80跟84行後面有加換行字元,但好像顯示不出來。大家可以參考以下這個網址:
回覆刪除http://download.oracle.com/javase/tutorial/uiswing/components/html.html
作者已經移除這則留言。
回覆刪除第80行改為 String result = "html" + "搜尋結果為:";
回覆刪除就可以囉!!!!
如果要換行的話在後面額外加上 "< br/>"
By 7002 :)
由於張貼意見無法發布 小括號 html 大括號 ,所以請自行加入!!!
回覆刪除由於張貼意見無法發布 小於 html 大於 ,所以請自行加入!!!
回覆刪除感謝同學的幫忙唷^^ 之前正為了沒辦法打上換行字元而苦惱~"~
回覆刪除