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