2012-01-26 213 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