2011-11-17 8 views
6

Questo è un crawling continuo per un principiante di lipster su Clojure e Java. Ho questo codice per selezionare un file, ma vorrei filtrare le estensioni dei file che sto cercando.Finestra di dialogo Clojure per selezione file con filtro per estensioni file

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

Il vostro aiuto è sempre stato molto apprezzato.

+1

Se avete in programma di passare molto tempo a fare interfacce utente in Clojure, si vorrà dare un'occhiata a una lib come Seesaw (https://github.com/daveray/seesaw). Ecco, questo è solo '(scegli-file: dir" C:/": filtri [[" Immagini "[" png "" jpeg "]]])'. Benvenuto in Clojure :) –

risposta

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

Lo capisco adesso. Molte grazie!!! – logigolf

+0

Prego. – BLUEPIXY

3

È necessario set the file filter, che è possibile eseguire estendendo la classe FileFilter o utilizzando un'implementazione incorporata come FileNameExtensionFilter. Si noti che FNEF accetta argomenti variabili in Java, il che significa che richiede un array in un bytecode JVM effettivo. Quindi qualcosa come

(FileNameExtensionFilter. 
"Text files only" 
(into-array ["txt"])) 

sarebbe un filtro semplice e ragionevole.

O se preferisci fare qualcosa di più specializzato, come accettare solo estensioni che contengono J, puoi implementare il filtro da solo. Purtroppo, Java ha scelto di rendere questa una classe astratta al 100% anziché un'interfaccia, quindi non è possibile utilizzare reify. In un mondo ideale si potrebbe scrivere

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

ma Java ama le classi, così invece è necessario

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

Grazie per la tua risposta molto veloce amalloy !! Come ho detto, scusa la mia ignoranza, ma sto 'strisciando' su Clojure e ho esperienza con zip Java. La mia domanda è: come posso implementare le tue soluzioni nel mio codice? – logigolf

+0

'(.setFileFilter filechooser (some-file-filter-thingy))' prima di aprire la finestra di dialogo. Questo dovrebbe essere tutto ciò che serve. – amalloy

Problemi correlati