[Swing]在 JFileChooser 中進行文件驗證的小技巧
我們在做GUI編程的時候經常需要用到JFileChooser組件構造一個文件選取對話框來為用戶提供打開文件、保存文件等操作。
通常的做法是調用JFileChooser.showXXX()方法顯示文件選取對話框并且選擇一個文件后,點擊Approve 按鈕(默認情況下標有 "Open" 或 "Save"),當對話框關閉后使用JFileChooser.getSelectedFile()方法得到選取的文件(或使用JFileChooser.getSelectedFiles()取得選取的文件數組),然后再對被選取的文件有效性進行驗證(例如,文件的文件名是否合法、選取的路徑下是否已有同名文件存在等等),如果驗證不通過,需要再次打開文件選擇對話框進行選取。
顯然,驗證沒有通過的情況下,文件選取對話框被反復的打開和關閉,影響用戶體驗。
我現在介紹一個方法,在點擊了文件選取對話框上的Approve 按鈕后,文件選取對話框關閉前對選取的文件進行驗證,如果驗證沒有通過,那么對話框不關閉,直接進行下一次選擇。
查看JFileChooser的API,可以發現這樣一個方法 public void approveSelection() ,這個方法會在用戶單擊 Approve 按鈕時由 UI 調用此方法。導致使用等于 APPROVE_SELECTION
的命令字符串激發一個操作事件。
那么,我們現在可以選擇繼承JFileChooser再覆寫這個方法,將對選中文件的有效性驗證寫入這個方法中,只有當驗證通過時才調用超類的approveSelection() 完成文件選取,否則直接返回,繼續選擇新的文件。
下面是我寫的一個demo以供參考:
import java.io.File;
import javax.swing.JOptionPane;
/**
?* 在 JFileChooser 中進行文件驗證的小技巧
?* @author Chen Wei
?* @email chenwei.mobi@gmail.com
?*/
public class JFileChooserDemo extends javax.swing.JFileChooser{
???
??? public void approveSelection(){
??????? File file = getSelectedFile();
???????
??????? // 驗證文件名是否合法
??????? if (!validateFileName(file.getName())) {
??????????? JOptionPane.showMessageDialog(getParent(), "文件名不能包含下列任何字符之一:\n \\ / : * ? \" < > |");
??????????? return;
??????? }else{
??????????? super.approveSelection();
??????? }
??? }
???
??? /**
???? * 驗證輸入字符串參數是否為有效文件名。
???? * @param name 待驗證的文件名字符串。
???? * @return 通過驗證,文件名無效返回 false,有效返回 true。
???? */
??? public static boolean validateFileName(String name) {
??????? if (name.indexOf('\\') != -1 || name.indexOf('/') != -1 ||
??????????? name.indexOf(':') != -1 || name.indexOf('*') != -1 ||
??????????? name.indexOf('?') != -1 || name.indexOf('"') != -1 ||
??????????? name.indexOf('<') != -1 || name.indexOf('>') != -1 ||
??????????? name.indexOf('|') != -1) {
??????????? return false;
??????? } else {
??????????? return true;
??????? }
??? }
???
??? public static void main(String[] args){
??????? JFileChooserDemo chooser = new JFileChooserDemo();
??????? chooser.showOpenDialog(null);
??? }
}
程序運行截圖:
posted on 2006-11-23 14:15 leon 閱讀(5397) 評論(7) 編輯 收藏 所屬分類: JFC