这是对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))
"")))
您的帮助总是非常感谢。
答案 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)))))