Clojure - 自动更新列表框

时间:2012-05-27 16:39:34

标签: clojure listbox seesaw

这就是我想做的事情:

我有一个代表项目列表的 参考 。我想要一个 列表框 (跷跷板?)显示此列表内容,自动更新(每当我更改参考时)。

2 个答案:

答案 0 :(得分:4)

您可以使用add-watch添加每次修改ref时都会调用的回调。此回调应调用更新列表框的方法:

(def data (ref [1 2 3]))

(defn list-model 
  "Create list model based on collection"
  [items]
  (let [model (javax.swing.DefaultListModel.)]
    (doseq [item items] (.addElement model item))
    model))

(def listbox (seesaw.core/listbox :model [])) 

(add-watch data nil
  (fn [_ _ _ items] (.setModel listbox (list-model items))))

答案 1 :(得分:4)

另一种方法是使用seesaw.bind将ref的内容绑定到列表框的模型。

(require [seesaw core [bind :as b]])
(def lb (listbox))
(def r (ref []))
(b/bind r (b/property lb :model))

跷跷板.bind图书馆非常值得探索,恕我直言。一旦你知道它们如何组合在一起,API就会有很好的记录; this blog post是一个很好的介绍。