ITEEDU

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