我們?cè)谧鯣UI編程的時(shí)候經(jīng)常需要用到JFileChooser組件構(gòu)造一個(gè)文件選取對(duì)話框來(lái)為用戶提供打開文件、保存文件等操作。
通常的做法是調(diào)用JFileChooser.showXXX()方法顯示文件選取對(duì)話框并且選擇一個(gè)文件后,點(diǎn)擊Approve 按鈕(默認(rèn)情況下標(biāo)有 "Open" 或 "Save"),當(dāng)對(duì)話框關(guān)閉后使用JFileChooser.getSelectedFile()方法得到選取的文件(或使用JFileChooser.getSelectedFiles()取得選取的文件數(shù)組),然后再對(duì)被選取的文件有效性進(jìn)行驗(yàn)證(例如,文件的文件名是否合法、選取的路徑下是否已有同名文件存在等等),如果驗(yàn)證不通過(guò),需要再次打開文件選擇對(duì)話框進(jìn)行選取。
顯然,驗(yàn)證沒有通過(guò)的情況下,文件選取對(duì)話框被反復(fù)的打開和關(guān)閉,影響用戶體驗(yàn)。
我現(xiàn)在介紹一個(gè)方法,在點(diǎn)擊了文件選取對(duì)話框上的Approve 按鈕后,文件選取對(duì)話框關(guān)閉前對(duì)選取的文件進(jìn)行驗(yàn)證,如果驗(yàn)證沒有通過(guò),那么對(duì)話框不關(guān)閉,直接進(jìn)行下一次選擇。
查看JFileChooser的API,可以發(fā)現(xiàn)這樣一個(gè)方法 public void approveSelection() ,這個(gè)方法會(huì)在用戶單擊 Approve 按鈕時(shí)由 UI 調(diào)用此方法。導(dǎo)致使用等于 APPROVE_SELECTION
的命令字符串激發(fā)一個(gè)操作事件。
那么,我們現(xiàn)在可以選擇繼承JFileChooser再覆寫這個(gè)方法,將對(duì)選中文件的有效性驗(yàn)證寫入這個(gè)方法中,只有當(dāng)驗(yàn)證通過(guò)時(shí)才調(diào)用超類的approveSelection() 完成文件選取,否則直接返回,繼續(xù)選擇新的文件。
下面是我寫的一個(gè)demo以供參考:
import java.io.File;
import javax.swing.JOptionPane;
/**
?* 在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧
?* @author Chen Wei
?* @email chenwei.mobi@gmail.com
?*/
public class JFileChooserDemo extends javax.swing.JFileChooser{
???
??? public void approveSelection(){
??????? File file = getSelectedFile();
???????
??????? // 驗(yàn)證文件名是否合法
??????? if (!validateFileName(file.getName())) {
??????????? JOptionPane.showMessageDialog(getParent(), "文件名不能包含下列任何字符之一:\n \\ / : * ? \" < > |");
??????????? return;
??????? }else{
??????????? super.approveSelection();
??????? }
??? }
???
??? /**
???? * 驗(yàn)證輸入字符串參數(shù)是否為有效文件名。
???? * @param name 待驗(yàn)證的文件名字符串。
???? * @return 通過(guò)驗(yàn)證,文件名無(wú)效返回 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);
??? }
}
程序運(yùn)行截圖:
