Do you drink java?



                像寫情書一樣coding

           

          [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);
          ??? }
          }


          程序運行截圖:
          JFileChooserDemo.jpg

          posted on 2006-11-23 14:15 leon 閱讀(5397) 評論(7)  編輯  收藏 所屬分類: JFC

          評論

          # re: [Swing]在 JFileChooser 中進行文件驗證的小技巧 2006-11-23 14:41 BeanSoft

          頂!  回復  更多評論   

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

          你好,看了你的技巧,真得很有幫助,我現在就JFileChooser的小問題想請教一下,就你上面的那個demo中,如果沒有輸入文件的話,你點擊打開按鈕沒有任何反應,現在我想做到以下兩點
          1.在初次打開保存對話框時,就文件名輸入欄中默認一個文件名
          2.還有,如果在文件名輸入欄中什么也不輸入的情況下,我要讓保存或者打開按鈕灰掉,怎么做到呢,就像word中的另存為一樣,謝謝!  回復  更多評論   

          # re: [Swing]在 JFileChooser 中進行文件驗證的小技巧 2006-12-19 10:36 leon

          1、在打開JFileChooser前,先調用setSelectedFile(File file) 方法設置一個文件。
          2、JFileChooser 沒有提供類似功能的API,但是有一種變通的做法。可以自己包裝一個組件,這個組件是一個JDialog,然后它上面放一個 JFileChooser 和2個JButton,2個JButton分別為保存和取消。初始化時通過設置JFileChooser.setControlButtonsAreShown(boolean b)方法隱藏JFileChooser自己的保存和取消按鈕,然后注冊PropertyChangeListener監聽JFileChooser中的屬性改變事件更新自定義的保存和取消按鈕狀態。不過這個方法不能監聽文件名輸入欄,因為文件名輸入欄內容改變我們無法監聽JFileChooser的屬性改變事件,JFileChooser也沒有提供API給文件名輸入欄添加監聽器。  回復  更多評論   

          # re: [Swing]在 JFileChooser 中進行文件驗證的小技巧[未登錄] 2007-03-21 10:49 allen

          這種情況怎么辦?

          使用JFileChooser時如何對Dialog中輸入的filename進行限制?


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

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

          新手求教,謝謝
            回復  更多評論   

          # re: [Swing]在 JFileChooser 中進行文件驗證的小技巧 2009-04-29 08:53 iSnail

          這種情況怎么辦?

          使用JFileChooser時如何對Dialog中輸入的filename進行限制?


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

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

          如上所述,用戶輸入// 或者\\,從組件獲得文件名就已經是過濾后的,根本不包含左斜杠或者右斜杠。需要怎么處理  回復  更多評論   

          # re: [Swing]在 JFileChooser 中進行文件驗證的小技巧 2009-05-28 10:51 gousheng12345

          樓主,你這個程序不管用呀  回復  更多評論   

          # re: [Swing]在 JFileChooser 中進行文件驗證的小技巧 2012-08-03 18:20 ngh

          輸入*還是會有問題  回復  更多評論   

          導航

          統計

          公告

          DSC_0106.jpg
          本博客已經搬家到CSDN
          http://blog.csdn.net/chenweionline




          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          About Technology

          My Favorite Website

          搜索

          積分與排名

          最新評論

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

          閱讀排行榜

          主站蜘蛛池模板: 禹州市| 平谷区| 和田市| 江门市| 抚宁县| 城市| 广灵县| 阿拉善盟| 高清| 大渡口区| 云安县| 五莲县| 海伦市| 贵定县| 连江县| 仁布县| 卢氏县| 洪洞县| 日土县| 滦南县| 六盘水市| 颍上县| 桂林市| 博湖县| 昆山市| 信宜市| 旬阳县| 文化| 余干县| 新野县| 汝城县| 醴陵市| 德江县| 景洪市| 翁源县| 利川市| 新沂市| 灌云县| 连山| 蓬溪县| 中牟县|