用于文件选择的Clojure对话框,带有文件扩展名的过滤器

时间:2011-11-17 19:13:54

标签: java swing clojure jfilechooser

这是对Clojure和Java的初学者的持续爬行。 我有这个代码来选择一个文件,但我想过滤我正在寻找的文件扩展名。

(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))
              "")))

您的帮助总是非常感谢。

2 个答案:

答案 0 :(得分: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))
              "")))

答案 1 :(得分: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)))))