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

7

我是一名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))
              "")))

Your help always much appreciated.


1
如果你计划在Clojure中花费大量时间进行UI开发,那么你会想要看一下像Seesaw这样的库(https://github.com/daveray/seesaw)。在那里,这只是`(choose-file :dir "C:/" :filters [["Images" ["png" "jpeg"]]])`。欢迎来到Clojure :) - Dave Ray
2个回答

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

3

您需要设置文件过滤器,可以通过扩展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,没有Java经验。我的问题是,我该如何将您的解决方案实现到我的代码中? - logigolf
在打开对话框之前,使用(.setFileFilter filechooser (some-file-filter-thingy))来设置文件过滤器即可。这就是所需的全部内容。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接