JFileChoose 保存對話框

13-1-2:建立可選擇文件類型的JFileChooser對話框:
    當你專爲某種文件類型設計一套軟件時,爲了用戶打開文件存盤方便,我們通常會在文件對話框中過濾掉無關的文件類型,讓用戶
很快速選擇出想要的文件數據.例如在Word軟件中,當我們按下"另存新文件"選項時,所出現的文件對話框將會以".doc"擴展名當作默
認的文件存儲類型.
    如果你所設計的軟件可以支持多種類型的文件操作,你應該設計讓用戶可以選擇使用哪一種類型的文件.
    若你想在java的文件對話框中做到這樣的功能,你必須實現FileFilter這個抽象類.此抽象類裏面定義了兩個空的方法,分別是
accept(File f)與getDescripton().當目錄裏的文件與設置的文件類型相符時,accept()方法就會返回true,並將此文件顯示在文件
對話框中.而getDescription()方法則是對此文件類型的描述,可由程序設計者自定義,如"*.java"等等.要設置選擇文件類型對話框
你可以使用JFileChooser的addChoosableFileFilter()方法或是setFileFilter()方法.下面這個例子我們實現FileFilter的功能,讓
用戶打開文件時可以選擇顯示所有文件,或是*.java文件,亦或是*.class文件.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;//由於我們在程序中要使用到File與FileFilter對象,因此要import File與FileFilter這兩個類.
import javax.swing.filechooser.FileFilter;

public class FileFilterDemo implements ActionListener{
  JFrame f=null;
  JLabel label=null;
  JFileChooser fileChooser=null;
  public FileFilterDemo(){
     f=new JFrame("FileFilterDemo");   
     Container contentPane=f.getContentPane();
    
     JButton b=new JButton("打開文件");
     b.addActionListener(this);
    
     label=new JLabel(" ",JLabel.CENTER);
     label.setPreferredSize(new Dimension(150,30));
     contentPane.add(label,BorderLayout.CENTER);
     contentPane.add(b,BorderLayout.SOUTH);
    
     f.pack();
     f.setVisible(true);
     f.addWindowListener(new WindowAdapter(){
         public void windowClosing(WindowEvent e){
           System.exit(0);   
         }        
     });
  }   
  public static void main(String[] args){
        new FileFilterDemo();
  }
  //處理用戶按下"打開舊文件"按鈕事件.
  public void actionPerformed(ActionEvent e){
       fileChooser=new JFileChooser("C://winnt");//以c://winnt爲打開文件爲對話框的默認路徑
      //利用addChoosableFileFilter()方法加入欲過濾的文件類型,使用addChoosableFileFilter()可以加入多種文件類型,
      //若你只需要過濾出一種文件類型,可使用setFileFilter()方法.
       fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
       fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
       int result=fileChooser.showOpenDialog(f);
       if (result==JFileChooser.APPROVE_OPTION){
         File file=fileChooser.getSelectedFile();
         label.setText("你選擇了:"+file.getName()+"文件");            
       }else if (result==fileChooser.CANCEL_OPTION){
           label.setText("你沒有選取文件");
       }
  }
}
//以JAVAFileFilter類繼承FileFilter抽象類,並實現accept()與getDescription()方法.
class JAVAFileFilter extends FileFilter{
    String ext;
    public JAVAFileFilter(String ext){
        this.ext=ext;   
    }   
   /*在accept()方法中,當程序所抓到的是一個目錄而不是文件時,我們返回true值,表示將此目錄顯示出來.*/
    public boolean accept(File file){
      if (file.isDirectory()){
         return true;   
      }   
      String fileName=file.getName();
      int index=fileName.lastIndexOf('.');
      if (index>0 && index<fileName.length()-1){
            //表示文件名稱不爲".xxx"現"xxx."之類型
            String extension=fileName.substring(index+1).toLowerCase();
          //若所抓到的文件擴展名等於我們所設置要顯示的擴展名(即變量ext值),則返回true,表示將此文件顯示出來,否則返回
          //true.
            if (extension.equals(ext))
              return true;
      }
      return false;
    }
    //實現getDescription()方法,返回描述文件的說明字符串!!!
    public String getDescription(){
        if (ext.equals("java"))
            return "JAVA Source File(*.java)";
        if (ext.equals("class"))
            return "JAVA Class File(*.class)";
        return "";
    }
}

13-1-3:建立具有特殊文件類型的圖標的JFileChooser:
     在上個範例中,讀者可以發現若你選擇顯示所有文件時,文件類型圖標不會因擴展名的不同而有所區別,這樣可能造成用戶混淆
或是使用上的不方便.
     要解決這個問題,你必須再實現FileView這個抽象類,此抽象類定義了5個空的方法,如下表所示:
FileView方法:
String    getDescription(File f):返回對這個文件的描述,如這是一張風景圖片等.
Icon      getIcon(File f):返回文件Icon圖標.
String    getName(File f):返回文件名.
String    getTypeDescription(File f):返回文件類型描述,如:"JAVA Source File"等等.
Boolean   isTraversable(File f):返回目錄是否可瀏覽.
    當你實現好這5個方法後,就可以利用JFileChooser的setFileView()方法來設置文件類型圖標.我們來看下面的範例:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.filechooser.*;

public class FileIconFilterDemo implements ActionListener
{
    JFrame f = null;
    JLabel label = null;
    JFileChooser fileChooser = null;
   
    public FileIconFilterDemo()
    {
        f = new JFrame("FileIconFilter Demo");
        Container contentPane = f.getContentPane();
       
        JButton b = new JButton("打開文件");
        b.addActionListener(this);
       
        label = new JLabel(" ",JLabel.CENTER);
        label.setPreferredSize(new Dimension(150,30));
        contentPane.add(label,BorderLayout.CENTER);
        contentPane.add(b,BorderLayout.SOUTH);
       
        f.pack();
        f.setVisible(true);
       
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }   
   
    public static void main(String[] args)
    {
        new FileIconFilterDemo();
    }
   
    public void actionPerformed(ActionEvent e)
    {
        fileChooser = new JFileChooser("c://winnt");
        fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
        fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
        fileChooser.setFileView(new FileIcon());
        int result = fileChooser.showOpenDialog(f);
        if(result == JFileChooser.APPROVE_OPTION)
        {
            File file = fileChooser.getSelectedFile();
            label.setText("您選擇了:"+file.getName()+"文件");
        }else if (result == fileChooser.CANCEL_OPTION){
            label.setText("您沒有選擇任何文件");
        }
    }
}

class JAVAFileFilter extends FileFilter
{
    String ext;
   
    public JAVAFileFilter(String ext)
    {
        this.ext = ext;
    }
   
    public boolean accept(File file)
    {
        if (file.isDirectory())
            return true;
       
        String fileName = file.getName();
        int index = fileName.lastIndexOf('.');

        if (index > 0 && index < fileName.length()-1) {
            String extension = fileName.substring(index+1).toLowerCase();
            if (extension.equals(ext))
                return true;
        }
        return false;
    }
   
    public String getDescription(){
        if (ext.equals("java"))
            return "JAVA Source File (*.java)";
        if (ext.equals("class"))
            return "JAVA Class File (*.class)";
        return "";
    }
}

class FileIcon extends FileView
{
    public String getName(File f) {
        return null; //返回值爲null的話,java look and feel功能會處理掉這個項目,並取得相關值來加以設置.
                     //一般而言可以使用f.getName()當返回值.
    }

    public String getDescription(File f) {
        return null; //返回值爲null的話,java look and feel功能會處理掉這個項目,並取得相關值來加以設置.
                     //你也可以自己設置對此圖片的描素,如這是一張風景圖片等等.
    }

    public String getTypeDescription(File f)
    {
        String extension = getExtensionName(f);
        if(extension.equals("java"))
            return "JAVA Source File";
        if(extension.equals("class"))
            return "JAVA Class File";
        return "";
    }

    public Icon getIcon(File f)
    {
        String extension = getExtensionName(f);
        if(extension.equals("java"))
            return new ImageIcon("java.gif");
        if(extension.equals("class"))
            return new ImageIcon("class.gif");
        return null;
    }

    public Boolean isTraversable(File f) {
        return null; //返回值爲null的話,java look and feel功能會處理掉這個項目,並取得相關值來加以設置.
                     //若佻不希望某個目錄被瀏覽,則返回值可以設爲Boolean.FALSE.
    }
   
    public String getExtensionName(File f)//在FileIcon類中我們增加一個getExtensionName()方法,用來返回文件的擴展名
    {                                      //名稱.
         String extension ="";
        String fileName = f.getName();
        int index = fileName.lastIndexOf('.');

        if (index > 0 && index < fileName.length()-1) {
            extension = fileName.substring(index+1).toLowerCase();
        }
        return extension;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章