ITEEDU

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