使用文件对话框 指定输入输出文件 是一个常用功能。 本博文介绍 用文件对话框 打开和保存 文件的方法
使用javax.swing.JFileChooser 实现打开和保存文件对话框
一. JFileChooser 类的常用方法
showOpernDialog() 打开 "打开文件对话框"
showSaveDialog() 打开 "保存文件对话框"
文件对话框打开后,在用户按下按钮或关闭对话框时,上述两个方法会返回一个整数值,分别为:
JFileChooser.APPROVE_OPTION : “撤消” 按钮
JFileChooser.CANCEL_OPTION: "打开/保存" 按钮
JFileChooser.ERROR_OPTION: 出错,或是对话框非正常关闭
二. 当程序发现用户选择了文件并按下了 "打开/保存" 按钮后,程序就可以利用 getSelectedFile() 取得文件对象, 并利用这个文件对象用方法 getName() 取得文件的名称, 用方法getPath() 取得文件的路径.
看一个例子, 程序首先弹出一个界面,有两个按钮:打开文件和保存文件。 当点击 打开文件时,弹出一个打开文件对话框; 当点击保存文件时, 弹出保存文件对话框。 程序设置了文件对话框的筛选条件。
程序入口:
public class Example9_6 {
public static void main(String[] args) {
FrameFileDialog f = new FrameFileDialog();
}
}
FrameFileDialog 类:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class FrameFileDialog extends JFrame implements ActionListener {
JFileChooser filedialog = null;
JLabel label = new JLabel("", JLabel.CENTER);
JButton b1, b2;
JTextArea text;
public FrameFileDialog() {
super("带文件对话框的窗口");
Container container = this.getContentPane();
container.setLayout(new BorderLayout());
container.setSize(100, 80);
JPanel p = new JPanel();
b1 = new JButton("打开文件");
b2 = new JButton("保存文件");
b1.addActionListener(this);
b2.addActionListener(this);
p.add(b1);
p.add(b2);
text = new JTextArea(20, 30);
JScrollPane jScrollPane = new JScrollPane();
filedialog = new JFileChooser(); //"D:\\Download"
// 建立一个FileChooser 对象,并指定目录为默认文件对话框路径
filedialog.setControlButtonsAreShown(true); //显示打开和撤消按钮
filedialog.addChoosableFileFilter(new MyFileFilter("txt"));
filedialog.addChoosableFileFilter(new MyFileFilter("java"));
text.setBackground(Color.cyan);
container.add(jScrollPane, BorderLayout.CENTER);
container.add(label,BorderLayout.NORTH);
container.add(p, BorderLayout.SOUTH);
setVisible(true);
pack();
}
@Override
public void actionPerformed(ActionEvent e) {
File file = null;
int result;
if(e.getSource() == b1) {
filedialog.setDialogTitle("打开文件");
result = filedialog.showOpenDialog(this);
text.setText("");
if(result == JFileChooser.APPROVE_OPTION) {
file = filedialog.getSelectedFile();
label.setText("你选择打开的文件名称是: " + file.getName());
//以下是打开文件 过程, 以notepad 记事本方式 打开
Runtime r = Runtime.getRuntime();
Process p = null;
String cmd[] = { "notepad", file.getAbsolutePath()};
try {
p = r.exec(cmd);
} catch (Exception ex) {
label.setText("error executing " + cmd[0]);
}
}else if(result == JFileChooser.CANCEL_OPTION){
label.setText("你没有选择任何文件");
}
FileInputStream fileInputStream;
if(file != null) {
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e1) {
label.setText("文件没有找到");
e1.printStackTrace();
return;
}
int readByte;
try {
while((readByte = fileInputStream.read()) != -1){
text.append(""+(char)readByte);
}
fileInputStream.close();
} catch (IOException e1) {
label.setText("读取文件出错");
e1.printStackTrace();
}
}
}else if(e.getSource() == b2) { //保存文件
filedialog.setDialogTitle("保存文件");
result = filedialog.showSaveDialog(this);
file = null;
String fileName;
if(result == JFileChooser.APPROVE_OPTION) {
file = filedialog.getSelectedFile();
label.setText("你选择保存的文件名称是: "+ file.getName());
}else if(result == JFileChooser.CANCEL_OPTION) {
label.setText("你没有选择任何文件");
}
FileOutputStream fos;
if(file != null){
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e1) {
label.setText("文件没有发现");
e1.printStackTrace();
return;
}
String content = text.getText();
try {
fos.write(content.getBytes());
fos.close();
} catch (IOException e1) {
label.setText("写文件出错");
e1.printStackTrace();
}
}
}
}
}
MyFileFilter 类:
import java.io.File;
import javax.swing.filechooser.FileFilter;
public class MyFileFilter extends FileFilter {
String ext;
public MyFileFilter(String t) {
ext = t;
}
@Override
public boolean accept(File f) {
if(f.isDirectory())
return true;
String fn = f.getName();
int index = fn.lastIndexOf('.');
if(index > 0 && index < fn.length() -1) {
String extension = fn.substring(index+1).toLowerCase();
if(extension.equals(ext))
return true;
}
return false;
}
@Override
public String getDescription() {
if(ext.equals("java")){
return "JAVA Source File(*.java)";
}else if("txt".equals(ext)){
return "Txt File(*.txt)";
}
return "";
}
}
运行效果
在打开文件对话框中, 可以设置筛选条件, 即指定文件的类型. 使用FileFilter类,该类预设两个方法,分别是 accept(File f) 与getDescription() . 当目录中的文件与筛选条件相符时,方法accept() 返回true, 并将此文件名显示在对话框中。而getDescription() 方法则是对筛选条件的描述. 由程序指定,例如, "*.java" 等. 如图
由于FileFilter 类是一个抽象类,程序要设置打开文件对话框的文件筛选条件,必须继承这个类.实现上面两个方法, 然后就可以使用 JFileChooser类的addChoosableFileFilter() 方法, 或者是setFileFilter() 方法设置筛选条件.