【Java学习】JFileChooser(文件选择器)的使用

一、概述。

javax.swing.JFileChooser()(文件选择器)提供了一种文件选择机制,一般用于打开文件,保存文件。

二、常用方法。

构造器:

1. public JFileChooser() : 构造一个JFileChooser对象,默认打开的文件夹为用户文件夹。

2. public JFileChooser(File currentDiretory) & public JFileChooser(String currentDiretory) : 创建一个打开文件夹currentDiretory的JFileChooser对象。 

3. public JFileChooser(FileSystemView fsv) : 创建一个基于fsv文件系统外观的JFileChooser对象。(参数说明:FileSystemView:文件系统外观,不设置则默认为当前文件系统的外观)

4. public JFileChooser(File currentDiretory, FileSystemView fsv) & public JFileChooser(String currentDiretory, FileSystemView fsv)  : 创建一个打开文件夹currentDiretory,基于fsv文件系统外观的JFileChooser对象。

【注】创建JFileChooser对象时无需指定parent组件,说明多个组件可以共用一个JFileChooser对象。

成员方法:

*各种参数设置

1.public void setCurrentDiretory(File dir) : 设置默认打开的文件夹。

2.public void setSelectedFile(File file) / public void setSelectedFiles(File[ ] selectedFiles) : 设置打开时默认选择的文件,可默认选择多个。

3.public void setSelectionMode(int mode) : 设置选择模式,默认情况为只可选文件,也可设置为只选文件夹,或可选文件及文件夹。(参数说明:可选参数为JFileChooser.FILES_ONLY / DIRETORY_ONLY / FILES_AND_DIRETORY)。

4.public void setMultiSelectionEnable(boolean b) : 默认只可选择一个目标,该方法设置参数为true可允许多选。

5.public void addChoosableFileFilter(FileFilter filter) : 在原有过滤器的基础上添加文件过滤器filter。

6.public void setFileFilter(FileFilter filter) : 设置文件过滤器filter,注意这将会清空之前的所有过滤器。

*调用选择对话框

1.public int showDialog(Component parent, String approveButtonText) / showOpenDialog(Component parent) / showSaveDialog(Component parent) : 弹出文件对话框,approveButtonText为“同意”按钮的文本,文件选择器常用于打开文件和保存文件,故提供了后两个方法,自动设置“同意”按钮的文本为“打开”和“保存”。返回一个int值,分别是 JFileChooser.APPROVE_OPTION,JFileChooser.CANCEL_OPTION和JFileChooser.ERROR_OPTION。在获取用户选择的文件之前,通常先验证返回值是否为APPROVE_OPTION.

*获取用户选择的文件

1.public File getSelectedFile() / pulbic File[ ] getSelectedFiles() : 返回用户选择的文件或文件集合。

三、使用说明。

    事实上,用文件选择器来进行文件及文件夹的选择操作十分简单,比如以下代码即能简单的选择文件。

     // 创建一个JFrame组件为parent组件
	JFrame frame = new JFrame();
    // 创建一个默认打开用户文件夹的问价选择器
	JFileChooser chooser = new JFileChooser();
	int flag = chooser.showOpenDialog(frame);
    //若选择了文件,则打印选择了什么文件
	if (flag == JFileChooser.APPROVE_OPTION) 
		System.out.println("用户选择了文件:" + chooser.getSelectedFile().getName());

       但是,在选择的时候,我们经常需要设置哪些类型的文件可见可选,比如,希望一个图片浏览器只能打开gif、jpg等图片类的文件,这时候就需要结合javax.swing.filechooser包下的抽象类FileFilter(文件过滤器)来使用。下面介绍一下FileFilter类的简单使用。

       继承FileFilter抽象类,需要重写两个抽象函数:

1.public abstract boolean accept(File file) : 判断文件是否可接受,只有可接受的文件才会在文件选择器显示。这是该抽象类的主要方法,实现了过滤功能。下面重写该方法,使该文件器只接受以mp4结尾的文件。

   public boolean accept(File file){
   //文件夹必须是可选(打开)的
   if(file.isDirectory())  return true;
   //以mp4结尾,设置为可选
   else if(file.getName().endsWith(".mp4")) return true;
   //其它的文件类型都设置为不可选
   return false;

2.public abstract void String getDescription() : 返回该文件过滤器的描述性内容。

四、项目实例--图片查看器。

import javax.swing.*;
import javax.swing.filechooser.*;
import javax.swing.filechooser.FileFilter;

import java.awt.*;
import java.io.*;
import java.util.ArrayList;

public class JFileChooserTest {
	//设置预览大小
	final int PREVIEW_SIZE=100;
	JFrame frame=new JFrame("图片查看器");
	JMenuBar menuBar=new JMenuBar();
	//该label用于显示图片
	JLabel label=new JLabel();
	//在当前路径下创建文件选择器
	JFileChooser chooser=new JFileChooser(".");
	//该Label用于显示预览
	JLabel accessory=new JLabel();
	//定义文件过滤器
	ExtensionFileFilter filter=new ExtensionFileFilter();
	FileInputStream fileInput;
	FileOutputStream fileOutput;
	public void init() {
		//------------下面初始化JFileChooser的相关属性--------------------
		filter.addExtension("jpg");
		filter.addExtension("jpeg");
		filter.addExtension("gif");
		filter.addExtension("png");
		filter.setDescription("文件图片(*.jpg, *.jpeg, *.gif, *png)");
		chooser.addChoosableFileFilter(filter);
		//隐藏下拉列表中的“所有文件”选项
		chooser.setAcceptAllFileFilterUsed(false);
		//为文件选择器指定一个预览图片的附件
		chooser.setAccessory(accessory);
		//设置预览组件的大小和边框
		accessory.setPreferredSize(new Dimension(PREVIEW_SIZE,PREVIEW_SIZE));
		accessory.setBorder(BorderFactory.createEtchedBorder());
		//用于检测被选文件改变的事件
		chooser.addPropertyChangeListener(event->{
			if(event.getPropertyName()==JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {
				//获取用户新选择的文件
				File f=(File)event.getNewValue();
				if(f==null) {
					accessory.setIcon(null);
					return;
				}
				//将被选文件读入ImageIcon对象中
				ImageIcon icon=new ImageIcon(f.getPath());
				//如果文件太大,则缩小它
				if(icon.getIconWidth()>PREVIEW_SIZE) {
					icon=new ImageIcon(icon.getImage().getScaledInstance(
							PREVIEW_SIZE, -1, Image.SCALE_DEFAULT));
				}
				//改变accessory的图标
				accessory.setIcon(icon);
			}
		});
	   //-----------下面开始为窗口安排菜单--------------
		JMenu menu=new JMenu("文件");
		menuBar.add(menu);
		JMenuItem openItem=new JMenuItem("打开");
		JMenuItem copyItem=new JMenuItem("保存副本为..");
		copyItem.setEnabled(false);
		menu.add(openItem);
		menu.add(copyItem);
		//单击“打开”弹出文件选择窗口
		openItem.addActionListener(event->{
			//显示文件对话框
			int result=chooser.showOpenDialog(frame);
			if(result==JFileChooser.APPROVE_OPTION) {
				String name=chooser.getSelectedFile().getPath();
				label.setIcon(new ImageIcon(name));
				try {
					fileInput=new FileInputStream(name);
				copyItem.setEnabled(true);
				} catch (FileNotFoundException e) {
					
					e.printStackTrace();
				}
			}
		});
		
		//实现图片的复制保存
		copyItem.addActionListener(event->{
			int result=chooser.showSaveDialog(frame);
			if(result==JFileChooser.APPROVE_OPTION) {
			String name=chooser.getSelectedFile().getName();
			File f=new File(name);
			try {
				fileOutput=new FileOutputStream(f);
				byte[] bytes=new byte[1024];
				int hasRead;
				while((hasRead=fileInput.read(bytes,0, 1024))!=-1) {
					fileOutput.write(bytes,0,hasRead);
				}
				fileOutput.close();
				fileInput.close();
			}catch(IOException ioe) {
				ioe.printStackTrace();
			}
			
					}
		});
		JMenuItem exitItem=new JMenuItem("Exit");
		menu.add(exitItem);
		exitItem.addActionListener(event->System.exit(0));
		label.setPreferredSize(new Dimension(500,500));
		frame.setJMenuBar(menuBar);
		frame.add(new JScrollPane(label));
		frame.pack();
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		new JFileChooserTest().init();
		
	}
	
	//创建FileFilter的子类,用于实现文件过滤功能
	class ExtensionFileFilter extends FileFilter{
		private String description;
		private ArrayList<String> extensions=new ArrayList<>();
		//自定义方法,用于添加文件后缀名
		public void addExtension(String extension) {
			if(!extension.startsWith("."))
				extension="."+extension;
			extensions.add(extension.toLowerCase());
		}
		//用于设置该文件过滤器的描述文本
		public void setDescription(String description) {
			this.description=description;
		}
		public String getDescription() {
			return description;
		}
		public boolean accept(File file) {
			if(file.isDirectory()) return true;
			String name=file.getName().toLowerCase();
			for(String extension:extensions) {
				if(name.endsWith(extension)) return true;
			}
			return false;
		}
	}
}

五、更多详细内容请参看API:https://docs.oacle.com/javase/8/docs/api/javax/swing/JFileChooser.html

猜你喜欢

转载自blog.csdn.net/chen_z_p/article/details/82794534
今日推荐