2010-06-16 7 views
8

I „Proxy“ bin mit verschiedenen Swing-Klassen in einer Clojure GUI-Anwendung zu erweitern, in der Regel mit dem Code, der so etwas wie folgt aussieht:Hinzufügen von Feldern zu einer Proxy-Klasse in Clojure

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

kann dies funktioniert gut, aber ich Finde heraus, wie man der neu erweiterten Klasse zusätzliche Felder hinzufügt, zum Beispiel das Hintergrundbild zu einem Feld macht, das später aktualisiert werden kann. Dies wäre ziemlich einfach und gängige Praxis in Java.

Gibt es einen guten Weg, dies in Clojure zu tun? Oder gibt es eine andere bevorzugte Methode, um denselben Effekt zu erzielen?

Antwort

9

Sie können so etwas wie folgt verwenden:

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

oder andere äußere Funktion/ref verwenden.

+0

sehr interessante Idee - meinst du mit defn eher als def? – mikera

+0

doto scheint hier angebracht: (doto g (.drawImage ...) (...)) – Greg

+0

hmmmm ... weiß jemand, wie Clojure das intern umsetzt? fügt es tatsächlich der proxied Klasse ein Feld hinzu? – mikera

2

Shameless Eigenwerbung: I wrote a blog post vor einer Weile über Proxy und seine Fallstricke.

+0

danke - sehr nützliche Anleitung! – mikera

Verwandte Themen