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;
}
}