2012-01-26 214 views
2

在clojure中,您可以創建SwingWorker代理並實現doInBackground並執行方法。你將如何繼續調用swingworker的執行方法?在clojure中執行SwingWorker

+2

你的問題到底是什麼?您是否嘗試過通常的Java-interop語法,如下所示:(.execute worker)? – MisterMetaphor

回答

2

您可以創建和調用使用標準的Java互操作

;; define a proxy that extends SwingWorker 
(def my-swing-worker 
    (proxy [SwingWorker] [] 
    (doInBackground [] 
     (reduce + (range 1000000))))) 

;; run the SwingWorker 
(.execute my-swing-worker) 

;; Get the result 
(.get my-swing-worker) 
=> 499999500000 

一個SwingWorker的,例如:然而,通常用Clojure你不會直接使用SwingWorkers。 Clojure中已經有一項功能提供了一個SwingWorker的功能:一個future使用一個單獨的線程來計算長時間運行的任務,並允許您稍後獲取結果。用法示例:

;; define and launch a future 
(def my-future 
    (future 
    (reduce + (range 1000000)))) 

;; get the result (will wait for future to complete if needed) 
@my-future 
=> 499999500000 

我想大多數人都會同意「純Clojure的」方式是在後臺運行的更簡單,更地道。我能想到的首選SwingWorker的唯一原因是,如果您使用了它提供的某些特定的GUI集成功能(例如觸發屬性更改事件的功能)。

+0

感謝您提供「純Clojure」的方式。 – adamjmarkham