功課這次是加分題,所以同學們擔心考試太差的話,這個功課也要交唷!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 大於 ,所以請自行加入!!!
回覆刪除感謝同學的幫忙唷^^ 之前正為了沒辦法打上換行字元而苦惱~"~
回覆刪除