Do you drink java?



                像寫(xiě)情書(shū)一樣coding

           

          [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧

          我們?cè)谧鯣UI編程的時(shí)候經(jīng)常需要用到JFileChooser組件構(gòu)造一個(gè)文件選取對(duì)話(huà)框來(lái)為用戶(hù)提供打開(kāi)文件、保存文件等操作。

          通常的做法是調(diào)用JFileChooser.showXXX()方法顯示文件選取對(duì)話(huà)框并且選擇一個(gè)文件后,點(diǎn)擊Approve 按鈕(默認(rèn)情況下標(biāo)有 "Open" 或 "Save")當(dāng)對(duì)話(huà)框關(guān)閉后使用JFileChooser.getSelectedFile()方法得到選取的文件(或使用JFileChooser.getSelectedFiles()取得選取的文件數(shù)組),然后再對(duì)被選取的文件有效性進(jìn)行驗(yàn)證(例如,文件的文件名是否合法、選取的路徑下是否已有同名文件存在等等),如果驗(yàn)證不通過(guò),需要再次打開(kāi)文件選擇對(duì)話(huà)框進(jìn)行選取。

          顯然,驗(yàn)證沒(méi)有通過(guò)的情況下,文件選取對(duì)話(huà)框被反復(fù)的打開(kāi)和關(guān)閉,影響用戶(hù)體驗(yàn)。

          我現(xiàn)在介紹一個(gè)方法,在點(diǎn)擊了文件選取對(duì)話(huà)框上的Approve 按鈕后,文件選取對(duì)話(huà)框關(guān)閉前對(duì)選取的文件進(jìn)行驗(yàn)證,如果驗(yàn)證沒(méi)有通過(guò),那么對(duì)話(huà)框不關(guān)閉,直接進(jìn)行下一次選擇。

          查看JFileChooser的API,可以發(fā)現(xiàn)這樣一個(gè)方法 public void approveSelection() ,這個(gè)方法會(huì)在用戶(hù)單擊 Approve 按鈕時(shí)由 UI 調(diào)用此方法。導(dǎo)致使用等于 APPROVE_SELECTION 的命令字符串激發(fā)一個(gè)操作事件。

          那么,我們現(xiàn)在可以選擇繼承JFileChooser再覆寫(xiě)這個(gè)方法,將對(duì)選中文件的有效性驗(yàn)證寫(xiě)入這個(gè)方法中,只有當(dāng)驗(yàn)證通過(guò)時(shí)才調(diào)用超類(lèi)的approveSelection() 完成文件選取,否則直接返回,繼續(xù)選擇新的文件。

          下面是我寫(xiě)的一個(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)行截圖:
          JFileChooserDemo.jpg

          posted on 2006-11-23 14:15 leon 閱讀(5405) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): JFC

          評(píng)論

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧 2006-11-23 14:41 BeanSoft

          頂!  回復(fù)  更多評(píng)論   

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧 2006-12-09 15:08 renchaoqun@163.com

          你好,看了你的技巧,真得很有幫助,我現(xiàn)在就JFileChooser的小問(wèn)題想請(qǐng)教一下,就你上面的那個(gè)demo中,如果沒(méi)有輸入文件的話(huà),你點(diǎn)擊打開(kāi)按鈕沒(méi)有任何反應(yīng),現(xiàn)在我想做到以下兩點(diǎn)
          1.在初次打開(kāi)保存對(duì)話(huà)框時(shí),就文件名輸入欄中默認(rèn)一個(gè)文件名
          2.還有,如果在文件名輸入欄中什么也不輸入的情況下,我要讓保存或者打開(kāi)按鈕灰掉,怎么做到呢,就像word中的另存為一樣,謝謝!  回復(fù)  更多評(píng)論   

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧 2006-12-19 10:36 leon

          1、在打開(kāi)JFileChooser前,先調(diào)用setSelectedFile(File file) 方法設(shè)置一個(gè)文件。
          2、JFileChooser 沒(méi)有提供類(lèi)似功能的API,但是有一種變通的做法。可以自己包裝一個(gè)組件,這個(gè)組件是一個(gè)JDialog,然后它上面放一個(gè) JFileChooser 和2個(gè)JButton,2個(gè)JButton分別為保存和取消。初始化時(shí)通過(guò)設(shè)置JFileChooser.setControlButtonsAreShown(boolean b)方法隱藏JFileChooser自己的保存和取消按鈕,然后注冊(cè)PropertyChangeListener監(jiān)聽(tīng)JFileChooser中的屬性改變事件更新自定義的保存和取消按鈕狀態(tài)。不過(guò)這個(gè)方法不能監(jiān)聽(tīng)文件名輸入欄,因?yàn)槲募斎霗趦?nèi)容改變我們無(wú)法監(jiān)聽(tīng)JFileChooser的屬性改變事件,JFileChooser也沒(méi)有提供API給文件名輸入欄添加監(jiān)聽(tīng)器。  回復(fù)  更多評(píng)論   

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧[未登錄](méi) 2007-03-21 10:49 allen

          這種情況怎么辦?

          使用JFileChooser時(shí)如何對(duì)Dialog中輸入的filename進(jìn)行限制?


          比如輸入a/7b,得到的filename是"7b",把"a/"作為路徑的一部分了而后的7b才作為filename

          因此怎么限制用戶(hù)輸入?如何得到在dialog中輸入的完整的filename?

          新手求教,謝謝
            回復(fù)  更多評(píng)論   

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧 2009-04-29 08:53 iSnail

          這種情況怎么辦?

          使用JFileChooser時(shí)如何對(duì)Dialog中輸入的filename進(jìn)行限制?


          比如輸入a/7b,得到的filename是"7b",把"a/"作為路徑的一部分了而后的7b才作為filename

          因此怎么限制用戶(hù)輸入?如何得到在dialog中輸入的完整的filename?

          如上所述,用戶(hù)輸入// 或者\(yùn)\,從組件獲得文件名就已經(jīng)是過(guò)濾后的,根本不包含左斜杠或者右斜杠。需要怎么處理  回復(fù)  更多評(píng)論   

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧 2009-05-28 10:51 gousheng12345

          樓主,你這個(gè)程序不管用呀  回復(fù)  更多評(píng)論   

          # re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧 2012-08-03 18:20 ngh

          輸入*還是會(huì)有問(wèn)題  回復(fù)  更多評(píng)論   

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          DSC_0106.jpg
          本博客已經(jīng)搬家到CSDN
          http://blog.csdn.net/chenweionline




          常用鏈接

          留言簿(5)

          隨筆分類(lèi)

          隨筆檔案

          About Technology

          My Favorite Website

          搜索

          積分與排名

          最新評(píng)論

          • 1.?re: 胃痙攣
          • 兄弟們你們都做胃鏡了嗎開(kāi)的啥藥?有什么養(yǎng)胃秘方啊?請(qǐng)賜教啊!
          • --我也進(jìn)來(lái)了
          • 2.?re: 胃痙攣
          • @痛啊
            我感覺(jué)比生孩子還疼,生孩子還能有意識(shí)呢!這種疼還叫不出來(lái)連說(shuō)話(huà)的力氣都沒(méi)了
          • --我也進(jìn)來(lái)了
          • 3.?re: 胃痙攣
          • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
          • --我也進(jìn)來(lái)了
          • 4.?re: 胃痙攣
          • 我都周期性的發(fā)作,算來(lái)有4年了 。每年最少一次,一次最少2天。吃了好多藥就差沒(méi)去做胃鏡了。 剛剛發(fā)作就隨便煮了點(diǎn)姜湯喝下就好了些,不知道還會(huì)不會(huì)發(fā)作了。
          • --許家洛
          • 5.?re: 胃痙攣
          • 我昨晚也疼的要死。。上次疼的直接120送醫(yī)院了,一上120我竟然就不疼了,醫(yī)院里掉了瓶鹽水就放回家了。這次正好國(guó)外旅游中,幾乎疼了一整晚,整個(gè)在床上翻滾狀態(tài)了。今天不疼了,就是整個(gè)人難受。。。求助阿
          • --胃疼
          • 6.?re: [Swing]在 JFileChooser 中進(jìn)行文件驗(yàn)證的小技巧
          • 輸入*還是會(huì)有問(wèn)題
          • --ngh
          • 7.?re: 胃痙攣[未登錄](méi)
          • 昨晚一夜的身不如死的感覺(jué),胃痙攣兄不要來(lái)了吧 ,求你了
          • --李飛
          • 8.?re: 胃痙攣
          • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
          • --daidai
          • 9.?re: 胃痙攣
          • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
          • --痛啊
          • 10.?re: 胃痙攣
          • 媽啊 痛的快死了~!第一次感覺(jué)過(guò)這樣的痛啊~!和女的生孩子有的一比了吧~!哭哭哭~!
          • --痛啊

          閱讀排行榜

          主站蜘蛛池模板: 揭东县| 锦屏县| 凤山县| 乌兰察布市| 乡宁县| 千阳县| 北票市| 达日县| 浦城县| 镇原县| 灵寿县| 会昌县| 阳东县| 洛南县| 根河市| 龙游县| 山东省| 安陆市| 宣恩县| 普格县| 凤山县| 昌乐县| 博客| 同德县| 宜兰县| 永胜县| 武冈市| 当涂县| 翁牛特旗| 电白县| 襄汾县| 修武县| 武邑县| 梧州市| 龙胜| 绩溪县| 宜宾县| 昌都县| 武强县| 阳谷县| 宁德市|