恬然自得.活在當下: [加分]Java Swing練習FileNameFilter搜尋文件

2011年6月14日 星期二

[加分]Java Swing練習FileNameFilter搜尋文件

功課這次是加分題,所以同學們擔心考試太差的話,這個功課也要交唷!FileNameFilter這個類別在Java Swing的官方文件也有介紹到,我想各位同學有興趣的話,可以參考:

大概在中間地帶,副標題寫著Filtering the List of Files。必須要宣告一個類別去實作FilenameFilter,必須要去覆寫accept方法,在裡面撰寫自己的商業邏輯。而如果要能夠搜尋副檔名的話,只要透過Filelist方法中放入FilenameFilter,就會自動把檔案路徑給予Filter,然後再把檔案中的副檔名擷取出來,進行字串的比較即可。

擷取副檔名可使用String.lastIndexOf(‘.’);
他就會取出一個字串中最後一個小數點的位置(通常最後一個小數點就是副檔名的那一個)。之後再使用String.substring和迴圈去抓出副檔名名稱,如此一來就能成功判斷。

當然我用了比較簡單的方法,String.endsWith(String suffix);

這個方法是取抓字串是以suffix作為結尾,則回傳truefalse。但是我上一個講的方法是Java官方公布出來的唷,我想工程師們一定有某種考量才會寫的比較麻煩,而我用的方法也許只能在比較簡單的程式上執行,只能說我還是新手XD不知道他們考量的是什麼。

按下「Launch」鈕,可直接操縱此次功課的程式,歡迎試試看唷!
P.S.家裡用IE可以成功執行。


不好意思,這次執行會沒辦法看見預定的結果,似乎是因為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);
   
  }
 }

}

6 則留言:

  1. Java Swing 是可以使用HTML語法的唷!所以Label要換行的話,也可以使用這個方法。原本程式碼第80跟84行後面有加換行字元,但好像顯示不出來。大家可以參考以下這個網址:
    http://download.oracle.com/javase/tutorial/uiswing/components/html.html

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 第80行改為 String result = "html" + "搜尋結果為:";
    就可以囉!!!!
    如果要換行的話在後面額外加上 "< br/>"

    By 7002 :)

    回覆刪除
  4. 由於張貼意見無法發布 小括號 html 大括號 ,所以請自行加入!!!

    回覆刪除
  5. 由於張貼意見無法發布 小於 html 大於 ,所以請自行加入!!!

    回覆刪除
  6. 感謝同學的幫忙唷^^ 之前正為了沒辦法打上換行字元而苦惱~"~

    回覆刪除

歡迎提供良性建議^_^