2011-11-17 10 views
6

Este es un rastreo continuo para principiantes de labios en Clojure y Java. Tengo este código para seleccionar un archivo, pero me gustaría filtrar las extensiones de los archivos que estoy buscando.Cuadro de diálogo Clojure para la selección de archivos con filtro para extensiones de archivos

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

Su ayuda siempre fue muy apreciada.

+1

Si usted está planeando pasar mucho tiempo haciendo interfaces de usuario en Clojure, querrá para echar un vistazo a una lib como Seesaw (https://github.com/daveray/seesaw). Ahí, esto es solo '(choose-file: dir" C:/": filters [[" Images "[" png "" jpeg "]]])'. Bienvenido a Clojure :) –

Respuesta

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 entiendo ahora. ¡¡¡Muchas gracias!!! – logigolf

+0

De nada. – BLUEPIXY

3

Necesita set the file filter, lo que puede hacer ampliando la clase FileFilter o utilizando una implementación incorporada como FileNameExtensionFilter. Tenga en cuenta que la FNEF toma argumentos variables en Java, lo que significa que toma una matriz en el bytecode de JVM real. Así que algo así como

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

sería un filtro simple y razonable.

O si prefiere hacer algo más especializado, como solo aceptar extensiones que tienen una J en ellas, puede implementar el filtro usted mismo. Lamentablemente, Java optó por hacer de esta una clase 100% abstracta en lugar de una interfaz, por lo que no puede usar reify. En un mundo ideal se podría escribir

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

pero ama Java clases, así que en vez necesita

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

Gracias por su rápida respuesta amalloy !! Como dije, disculpe mi ignorancia, pero estoy 'gateando' en Clojure y tengo una experiencia zip de Java. Mi pregunta es ¿cómo implemento sus soluciones en mi código? – logigolf

+0

'(.setFileFilter filechooser (some-file-filter-thingy))' antes de abrir el cuadro de diálogo. Eso debería ser todo lo que se necesita. – amalloy

Cuestiones relacionadas