2010-06-16 12 views
8

używam „proxy” w celu rozszerzenia różnych klas Swing Clojure w aplikacji GUI, zazwyczaj z kodem, który wygląda mniej więcej tak:Dodawanie pól do zastępowanym klasy w Clojure

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

Działa to dobrze, ale mogę • wymyślić, jak dodać dodatkowe pola do nowo rozszerzonej klasy, na przykład uczynić obraz tła polem, który można następnie zaktualizować. Byłoby to dość łatwą i powszechną praktyką w Javie.

Czy jest to dobry sposób na zrobienie tego w Clojure? Czy istnieje inna preferowana metoda osiągnięcia tego samego efektu?

Odpowiedz

9

Można użyć coś takiego:

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

lub innej zewnętrznej funkcji/ref.

+0

bardzo ciekawy pomysł - masz na myśli raczej defn niż def? – mikera

+0

doto wydaje się odpowiednie tutaj: (doto g (.drawImage ...) (...)) – Greg

+0

hmmmm ... ktoś wie, jak Clojure wdraża to wewnętrznie? czy w rzeczywistości dodaje pole do pośredniczonej klasy? – mikera

Powiązane problemy