檔案選擇類JFileChooser用法
其實JFileChooser基本使用方法還是很簡單的,下面寫兩個示例看了就明白了,如果還要增加一些功能,我們還可以新增過濾器,只顯示過濾後的檔案。還可以再儲存的時候,如果儲存的是目錄裡已經存在的檔案,那麼對話方塊不會關閉,並且彈出一個JOptionPane提示使用者是否儲存檔案。
開啟檔案對話方塊:
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
public class FileChooserTest {
public static void main(String [] args) {
//首先是建立JFileChooser 物件,裡面帶個引數,表示預設開啟的目錄,這裡是預設開啟當前檔案所在的目錄。
JFileChooser file = new JFileChooser (".");
//下面這句是去掉顯示所有檔案這個過濾器。
file.setAcceptAllFileFilterUsed(false);
//新增excel檔案的過濾器
file.addChoosableFileFilter(new ExcelFileFilter("xls"));
//新增exe檔案的過濾器
file.addChoosableFileFilter(new ExcelFileFilter("exe"));
/*使用showOpenDialog()方法,顯示出開啟選擇檔案的視窗,當選擇了某個檔案後,或者關閉此視窗那麼都會返回一個
整型數值,如果返回的是0,代表已經選擇了某個檔案。如果返回1代表選擇了取消按鈕或者直接關閉了視窗*/
int result = file.showOpenDialog(null);
/*JFileChooser.APPROVE_OPTION是個整型常量,代表0。就是說當返回0的值我們才執行相關操作,否則什麼也不做。
if(result == JFileChooser.APPROVE_OPTION)
{
/*獲得你選擇的檔案絕對路徑。並輸出。當然,我們獲得這個路徑後還可以做很多的事。
String path = file.getSelectedFile().getAbsolutePath();
System.out.println(path);
}
else
{
System.out.println("你已取消並關閉了視窗!");
}
}
/*因為我們需要建立一個檔案的過濾器,以便讓檔案對話方塊顯示我們指定的檔案。這裡我們就以Excel檔案和exe檔案舉例。
那麼要做到這點我們就需要重寫FileFilter 類的accept來設定相關的過濾器。這個繼承類你可以寫成外部類、內部類甚至是
匿名內部類。我這裡寫成了一個內部類的形式。因為是在main方法使用他,因此這個類也要定義成 靜態的。
private static class ExcelFileFilter extends FileFilter {
String ext;
//構造方法的引數是我們需要過濾的檔案型別。比如excel檔案就是 xls,exe檔案是exe.
ExcelFileFilter(String ext) {
this.ext = ext;
}
/*這個方法就是重寫 FileFilter 類的方法,引數是File物件,一般這個引數是如何傳入的我們可以不用關心。他返回一個布林型。如果為真表示該檔案符合過濾設定,那麼就會顯示在當前目錄下,如果為假就會被過濾掉。
public boolean accept(File file) {
//首先判斷該目錄下的某個檔案是否是目錄,如果是目錄則返回true,即可以顯示在目錄下。
if (file.isDirectory())
{
return true;
}
//獲得某個檔案的檔名,然後使用lastIndexOf()來獲得這個檔名字串中'.'這個字元最後一次出現的位置。並且通過它返回的一個整型來判斷該檔案是否符合*.*這中檔案+檔名的格式,如果不符合那麼就不顯示這個檔案。如果符合,那麼就將'.'字元後面的字串提取出來與過濾的檔名相比較,如果相等則符合該檔案格式,並顯示出來。如果不相等那麼就將其過濾掉。*/
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;
}
/*這個方法也是重寫FileFilter的方法,作用是在過濾名那裡顯示出相關的資訊。這個與我們過濾的檔案型別想匹配,通過這些資訊,可以讓使用者更清晰的明白需要過濾什麼型別的檔案。*/
public String getDescription() {
if (ext.equals("xls"))
{
return "Microsoft Excel檔案(*.xls)";
}
if(ext.equals("exe"))
{
return "可執行檔案(*.exe)";
}
return "";
}
}
}
開啟選擇檔案的對話方塊就建立好了。但是上面的程式還有瑕疵。因為只有當用戶點取消或關閉該視窗時才不會執行任何操作。而如果使用者在對話方塊裡輸入的檔案在當前目錄中不存在時,那麼視窗依然會關閉,這時可能就需要在程式中再來做判斷。那麼可不可以在當用戶輸入錯誤的檔名後,視窗不會關閉,而是不執行任何操作或者彈出個對話方塊提示使用者,可以看看大多數window程式中的選擇對話方塊都是這麼做的,其實要實現這個功能也不難,只需要再重寫一下JFileChooser類的approveSelection()方法就行了。
我們將上面的程式做下修改,首先還是需要建立一個繼承於JFileChooser的類,這個類可以寫成外部或者內部類,我們這裡依然寫為內部類,注意,如果需要在靜態方法中呼叫它,則需要將它設定為靜態的。
private static class MyChooser extends JFileChooser {
MyChooser(String path) {
super(path);
}
/**
* 過載JFileChooser的方法,當在檔案選擇對話方塊中,並在當前
* 目錄下沒有找到輸入的檔案,則對話方塊不會關閉。直到選擇的檔案 在當前選擇的目錄下,才關閉對話方塊,並執行後面的操作。
*/
public void approveSelection() {
File file = new File(getSelectedFile().getPath());
if (file.exists())
super.approveSelection();
else
JOptionPane.showMessageDialog(null, "你選擇的檔案不存在,請重新選擇!");
}
把上面這段程式碼新增進剛才的類裡面,然後把
JFileChooser file = new JFileChooser (".");改成
JFileChooser file = new MyChooser (".");
好了,現在我們就可以在不關閉該對話方塊的情況下判斷使用者的輸入是否錯誤了。還可以加入正則表示式,判斷使用者輸入是否符合規定,操作方式按照這個框架來寫就沒問題了。這裡不再贅述。下面是儲存對話方塊!
儲存對話方塊:
其實儲存對話方塊和開啟檔案對話方塊在使用上沒什麼區別,他們都是使用同一個類JFileChooser,因為在swing當中開啟和儲存對話方塊不會做出任何對檔案進行處理的功能,所有的這些功能需要我們自己去實現,而僅僅是提供了1個這樣的視窗模型而已。因此這兩種視窗其實只是將按鈕的標籤進行了替換而已。建立他們唯一的區別就是開啟是呼叫showOpenDialog()方法,儲存則是呼叫showSaveDialog(),建立形式幾乎一樣。我們在使用他們的時候就需要分別對這兩種視窗的返回後進行不同的處理,設定過濾器是一樣的,因此過濾器我們就複用上面開啟檔案視窗的方法,但是在判斷輸入儲存檔案是否在當前目錄下時,我們需要做出不一樣的處理。當用戶輸入了與當前目錄相同的檔名後,要彈出對話方塊詢問使用者是否需要覆蓋原檔案,如果使用者選擇否,那麼返回儲存檔案的對話方塊允許使用者繼續選擇或者輸入儲存的檔名。
下面我只需要修改上面程式碼的兩個地方就能夠達到目的。首先將修改一下MyChooser這個類
private static class MyChooser extends JFileChooser {
MyChooser(String path) {
super(path);
}
/*同樣是覆蓋approveSelection方法,首先獲得輸入檔案的路徑,然後判斷其是否在當前目錄下,如果存在,那麼彈出對話方塊詢問是否需要覆蓋當前檔案,如果選擇取消,則回到儲存對話方塊,使用者可以繼續進行儲存的操作。*/
public void approveSelection() {
File file = this.getSelectedFile();
if (file.exists())
{
int copy = JOptionPane.showConfirmDialog(null,
"是否要覆蓋當前檔案?", "儲存", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (copy == JOptionPane.YES_OPTION)
super.approveSelection();
}
else
super.approveSelection();
}
}
再把上面的
int result = file.showOpenDialog(null);
改成
int result = file.showSaveDialog(null);
兩個基本的選擇檔案對話方塊就建立完成了。
如果需要多選,那麼要設定setMultiSelectionEnabled(true)
那麼File file = this.getSelectedFile();這句我們就要改成
File [] files = this.getSelectedFiles();
files這個數組裡面就存放的是選擇多個檔案File物件,然後我們只需要對這個陣列進行操作即可。