一、概述。
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 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