2011-11-17 35 views
6

Đây là trình thu thập thông tin liên tục cho người mới bắt đầu sử dụng lipster trên Clojure và Java. Tôi có mã này để chọn tệp nhưng tôi muốn lọc các tiện ích mở rộng của tệp mà tôi đang tìm kiếm.Hộp thoại Clojure để chọn tệp có bộ lọc cho các phần mở rộng của tệp

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

Trợ giúp của bạn luôn được đánh giá cao.

+1

Nếu bạn đang lập kế hoạch chi tiêu nhiều thời gian làm UIS trong Clojure, bạn sẽ muốn để có một cái nhìn tại một lib như Seesaw (https://github.com/daveray/seesaw). Ở đây, đây chỉ là '(select-file: dir" C:/": bộ lọc [[" Hình ảnh "[" png "" jpeg "]]])'. Chào mừng bạn đến với Clojure :) –

Trả lời

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

Tôi hiểu ngay bây giờ. Cảm ơn rất nhiều!!! – logigolf

+0

Bạn được chào đón. – BLUEPIXY

3

Bạn cần set the file filter, bạn có thể thực hiện bằng cách mở rộng lớp FileFilter hoặc sử dụng triển khai được cài sẵn như FileNameExtensionFilter. Lưu ý rằng FNEF lấy các đối số biến trong Java, có nghĩa là nó lấy một mảng trong bytecode JVM thực tế. Vì vậy, một cái gì đó như

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

sẽ là một bộ lọc đơn giản, hợp lý.

Hoặc nếu bạn muốn làm điều gì đó chuyên biệt hơn, như chỉ chấp nhận các tiện ích mở rộng có J trong đó, bạn có thể tự triển khai chế độ lọc. Đáng buồn thay, Java đã chọn để làm cho một lớp trừu tượng 100% thay vì một giao diện, vì vậy bạn không thể sử dụng reify. Trong một thế giới lý tưởng bạn có thể viết

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

nhưng Java yêu lớp, vì vậy thay vào đó bạn cần

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

Cảm ơn bạn đã trả lời câu trả lời rất nhanh! Như tôi đã nói, xin lỗi về sự thiếu hiểu biết của tôi, nhưng tôi đang 'thu thập dữ liệu' trên Clojure và có trải nghiệm Java zip. Câu hỏi của tôi là làm thế nào để tôi thực hiện các giải pháp của bạn vào mã của tôi? – logigolf

+0

'(.setFileFilter filechooser (một số tập tin-bộ lọc-thingy))' trước khi bạn mở hộp thoại. Đó là tất cả phải mất. – amalloy

Các vấn đề liên quan