2011-11-17 19 views
6

Bu, Clojure ve Java üzerinde bir lipster başlangıcı için sürekli taramadır. Bir dosya seçmek için bu koda sahibim, ancak dosyaların aradığım uzantılarına filtre uygulamak istiyorum.Dosya uzantıları için filtreli dosya seçimi için Clojure iletişim kutusu

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

Yardımınız her zaman çok takdir edilmektedir.

+1

gerekiyorsa, isteyeceksiniz Seesaw gibi bir lib a bakmak için (https://github.com/daveray/seesaw). Orada, bu sadece '(dosya-dosya: dir" C:/": filtreler [[" Görüntüler "[" png "" jpeg "]]])' dir. Clojure'a Hoş Geldiniz :) –

cevap

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)) 
       ""))) 
+0

Şimdi anlıyorum. Çok teşekkürler!!! – logigolf

+0

Rica ederim. – BLUEPIXY

3

FileFilter sınıfını genişleterek veya FileNameExtensionFilter gibi yerleşik bir uygulama kullanarak yapabileceğiniz set the file filter gerekir. FNEF'in değişken argümanları Java'da aldığını, yani gerçek JVM bayt kodunda bir dizi aldığını unutmayın. Yani

, basit, makul bir filtre olacaktır.

Ya da sadece bir J'si olan uzantıları kabul etmek gibi daha uzmanlaşmış bir şey yapmayı tercih ederseniz, filtrelemeyi kendiniz uygulayabilirsiniz. Ne yazık ki, Java bunu bir arayüz yerine% 100 bir soyut sınıf haline getirmeyi seçti, böylece reify kullanamazsın. İdeal bir dünyada sen

(reify java.io.FileFilter 
    (getDescription [this] "Java loves Js!") 
    (accept [this f] 
    (boolean (re-find #"\..*j[^.]*$" (.getName f))))) 

yazabilirim ama Java sınıflarını sever, bu yüzden Clojure UI'leri yapıyor kadar vakit planlıyorsanız yerine

(proxy [java.io.FileFilter] [] 
    (getDescription [] "Java loves Js!") 
    (accept [f] 
    (boolean (re-find #"\..*j[^.]*$" (.getName f))))) 
+0

Çok hızlı yanıt veren amalloy'unuz için teşekkürler! Dediğim gibi, cehaletimi affedin, fakat Clojure'a 'sürünüyorum' ve zip Java deneyimim var. Sorum şu: Çözümlerinizi koduma nasıl uygularım? – logigolf

+0

(iletişim kuralı'nı açmadan önce .setFileFilter filechooser (dosya filtresi-thingy)). Tüm gereken bu olmalı. – amalloy

İlgili konular