2012-05-27 4 views
6

est ici ce que je voudrais faire:Clojure - mise à jour automatique Listbox

J'ai un ref qui représente une liste d'éléments. Je voudrais avoir un listbox (balançoire?) Qui affiche ce contenu des listes, mise à jour automatiquement (chaque fois que je change l'arbitre).

Répondre

4

Vous pouvez utiliser add-watch pour ajouter un rappel qui sera appelé à chaque fois que ref est modifié. Ce rappel doit appeler la méthode qui met à jour listbox:

(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

merci beaucoup; cela a fonctionné parfaitement –

4

Une autre façon de le faire est de lier le contenu de l'arbitre au modèle de la zone de liste, en utilisant seesaw.bind.

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

La bibliothèque seesaw.bind vaut la peine d'être explorée, à mon humble avis. Le API est bien documenté une fois que vous avez une idée de comment tout cela s'accorde; this blog post est une belle introduction.