2011-11-17 48 views
6

這是一個針對Clojure和Java的lipster初學者的連續爬行。 我有這段代碼來選擇一個文件,但我想過濾文件的擴展名,我正在尋找。用於文件選擇的Clojure對話框,帶有用於文件擴展名的篩選器

(import javax.swing.JFileChooser) 
(defn tlt-get-file [ ] 
     (let [ filechooser (JFileChooser. "C:/") 
       retval (.showOpenDialog filechooser nil) ] 
      (if (= retval JFileChooser/APPROVE_OPTION) 
      (do 
       (println (.getSelectedFile filechooser)) 
       (.getSelectedFile filechooser)) 
       ""))) 

您的幫助總是非常感謝。

+1

如果你在花費大量時間用Clojure做UI的計劃,你會想看一下像Seesaw這樣的庫(https://github.com/daveray/seesaw)。在那裏,這只是'(選擇文件:目錄「C:/」:filters [[「Images」[「png」「jpeg」]]])''。歡迎來到Clojure :) –

回答

6
(import '(javax.swing JFileChooser) 
     '(javax.swing.filechooser FileNameExtensionFilter)) 
(defn tlt-get-file [ ] 
     (let [ extFilter (FileNameExtensionFilter. "Text File" (into-array ["txt"])) 
       filechooser (JFileChooser. "C:/") 
       dummy (.setFileFilter filechooser extFilter) 
       retval (.showOpenDialog filechooser nil) ] 
      (if (= retval JFileChooser/APPROVE_OPTION) 
      (do 
       (println (.getSelectedFile filechooser)) 
       (.getSelectedFile filechooser)) 
       ""))) 
+0

我現在明白了。非常感謝!!! – logigolf

+0

不客氣。 – BLUEPIXY

3

您需要set the file filter,您可以通過擴展FileFilter類或使用內置實現(如FileNameExtensionFilter)來執行此操作。請注意,FNEF在Java中採用可變參數,這意味着它需要實際JVM字節碼中的數組。所以像

(FileNameExtensionFilter. 
"Text files only" 
(into-array ["txt"])) 

將是一個簡單,合理的過濾器。

或者,如果您寧願做更專業的事情,比如只接受其中含有J的擴展名,您可以自己實施過濾。可悲的是,Java選擇使這個100%抽象類而不是一個接口,所以你不能使用reify。在一個理想的世界裏,你可以寫

(reify java.io.FileFilter 
    (getDescription [this] "Java loves Js!") 
    (accept [this f] 
    (boolean (re-find #"\..*j[^.]*$" (.getName f))))) 

但Java愛的類,所以不是你需要

(proxy [java.io.FileFilter] [] 
    (getDescription [] "Java loves Js!") 
    (accept [f] 
    (boolean (re-find #"\..*j[^.]*$" (.getName f))))) 
+0

感謝您快速回答amalloy!正如我所說,請原諒我的無知,但我正在Clojure上爬行,並擁有Java的體驗。我的問題是如何將你的解決方案實現到我的代碼中? – logigolf

+0

'(.setFileFilter filechooser(some-file-filter-thingy))''在打開對話框之前。這應該是它所需要的。 – amalloy

相關問題