1. 程式人生 > >輸入和輸出流__檔案對話方塊 JFileChooser

輸入和輸出流__檔案對話方塊 JFileChooser

使用檔案對話方塊 指定輸入輸出檔案 是一個常用功能。 本博文介紹 用檔案對話方塊 開啟和儲存 檔案的方法

使用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() 方法設定篩選條件.