2012-05-27 25 views
6

Esto es lo que me gustaría hacer:Clojure - Autoupdating cuadro de lista

Tengo un ref que representa una lista de elementos. Me gustaría tener un listbox (¿balancín?) Que muestra los contenidos de esta lista, actualizándose automáticamente (cada vez que cambio la referencia).

Respuesta

4

Puede usar add-watch para agregar una devolución de llamada que se invocará cada vez que se modifique la referencia. Esta devolución de llamada debe llamar al método que actualiza cuadro de lista:

(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

muchas gracias; esto funcionó perfectamente –

4

Otra manera de hacerlo es enlazar el contenido del árbitro el modelo del cuadro de lista, utilizando seesaw.bind.

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

La biblioteca seesaw.bind vale la pena explorar, en mi humilde opinión. El API está bien documentado una vez que tenga una idea de cómo encaja todo; this blog post es una buena introducción.

Cuestiones relacionadas