2012-05-27 8 views
6

hier ist, was ich tun möchte:Clojure - Autoupdating Listbox

Ich habe eine ref, die eine Liste von Elementen darstellt. Ich hätte gerne eine Listbox (Wippe?), Die diese Listen Inhalte anzeigt, automatisch aktualisiert (wann immer ich die Ref ändern).

Antwort

4

Sie können add-watch verwenden, um einen Rückruf hinzuzufügen, der jedes Mal aufgerufen wird, wenn ref geändert wird. Dieser Callback sollte Methode aufrufen, die Listbox aktualisiert:

(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)))) 
+0

vielen Dank; das hat perfekt funktioniert –

4

Ein anderer Weg, es zu tun ist, um den Inhalt des ref zum Modell des listbox zu binden, mit seesaw.bind.

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

Die Bibliothek seeseaw.bind ist es wert, erforscht zu werden, IMHO. Die API ist gut dokumentiert, sobald Sie eine Idee haben, wie alles zusammenpasst; this blog post ist eine nette Einführung.