2010-06-16 13 views
8

J'utilise « proxy » pour étendre différentes classes Swing dans une application GUI Clojure, généralement avec le code qui ressemble à:Ajout de champs à une classe approximé dans Clojure

(def ^JPanel mypanel 
    (proxy [JPanel] [] 
    (paintComponent [#^Graphics g] 
     (.drawImage g background-image 0 0 nil)))) 

Cela fonctionne bien, mais je ne peux Ne comprenez pas comment ajouter des champs supplémentaires à la classe nouvellement étendue, par exemple en faisant de l'image d'arrière-plan un champ qui pourrait être mis à jour par la suite. Ce serait une pratique assez facile et courante en Java.

Existe-t-il un bon moyen de le faire dans Clojure? Ou y a-t-il une autre méthode préférée pour obtenir le même effet?

Répondre

9

Vous pouvez utiliser quelque chose comme ceci:

(defn ^JPanel mypanel [state] 
    (proxy [JPanel] [] 
    (paintComponent [#^Graphics g] 
     (do 
     (comment do something with state) 
     (.drawImage g background-image 0 0 nil))))) 

ou utiliser toute autre fonction extérieure/ref.

+0

idée très intéressante - voulez-vous dire avec defn plutôt que def? – mikera

+0

doto semble approprié ici: (doto g (.drawImage ...) (...)) – Greg

+0

hmmmm ... quelqu'un sait comment Clojure met en œuvre cela en interne? Est-ce qu'il ajoute réellement un champ à la classe mandatée? – mikera