在clojure中执行SwingWorker

时间:2012-01-26 08:50:24

标签: swing clojure swingworker

在clojure中,您可以创建SwingWorker代理并实现doInBackground并执行方法。你会如何继续调用swingworker的执行方法?

1 个答案:

答案 0 :(得分:2)

您可以使用标准Java互操作创建和调用SwingWorker,例如:

;; 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

但是,通常在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集成功能(例如,触发属性更改事件的能力)。