Закрывающее диалоговое окно для выбора файла с фильтром для расширений файлов - PullRequest
6 голосов
/ 17 ноября 2011

Это непрерывное сканирование новичка на 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 ]

6 голосов
/ 18 ноября 2011
(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 голосов
/ 17 ноября 2011

Вам необходимо установить фильтр файлов , что вы можете сделать, либо расширив класс 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)))))
...