【问题标题】:Clojure dialog box for file selection with filter for files' extensions用于文件选择的 Clojure 对话框,带有文件扩展名的过滤器
【发布时间】:2011-11-17 19:13:54
【问题描述】:

这是针对 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))
              "")))

非常感谢您的帮助。

【问题讨论】:

  • 如果你打算花很多时间在 Clojure 中做 UI,你会想看看像 Seesaw 这样的库 (github.com/daveray/seesaw)。在那里,这只是(choose-file :dir "C:/" :filters [["Images" ["png" "jpeg"]]])。欢迎使用 Clojure :)

标签: java swing clojure jfilechooser


【解决方案1】:
(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))
              "")))

【讨论】:

    【解决方案2】:

    您需要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)))))
    

    【讨论】:

    • 感谢您非常快速的回答 amalloy!正如我所说,请原谅我的无知,但我在 Clojure 上“爬行”并且有 zip Java 经验。我的问题是如何在我的代码中实现您的解决方案?
    • (.setFileFilter filechooser (some-file-filter-thingy)) 在您打开对话框之前。应该就是这样了。
    猜你喜欢
    • 2019-09-12
    • 2012-05-18
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多