Mercurial > hg > indyvon
changeset 17:31382464ef27
Use Swing instead of plain AWT to get double buffering.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Thu, 17 Jun 2010 05:42:05 +0400 |
parents | 0fda22fc53d2 |
children | 740b9d2bbc45 |
files | src/indyvon/component.clj |
diffstat | 1 files changed, 32 insertions(+), 29 deletions(-) [+] |
line diff
1.1 --- a/src/indyvon/component.clj Thu Jun 17 05:20:37 2010 +0400 1.2 +++ b/src/indyvon/component.clj Thu Jun 17 05:42:05 2010 +0400 1.3 @@ -8,44 +8,47 @@ 1.4 (:use indyvon.core 1.5 indyvon.event) 1.6 (:import (java.awt Component Dimension Color) 1.7 - (java.awt.event MouseEvent))) 1.8 - 1.9 -(defn- make-update-fn [component] 1.10 - (fn [] (.repaint component))) 1.11 + (java.awt.event MouseEvent) 1.12 + (javax.swing JFrame JPanel))) 1.13 1.14 (defn- font-context [component] 1.15 (.getFontRenderContext (.getFontMetrics component (.getFont component)))) 1.16 1.17 -(defn make-component 1.18 +(defn paint-component [component layer context graphics] 1.19 + (let [size (.getSize component) 1.20 + width (.width size) 1.21 + height (.height size) 1.22 + context (assoc context 1.23 + :font-context (.getFontRenderContext graphics) 1.24 + :update-fn #(.repaint component))] 1.25 + (draw! context layer graphics 0 0 width height false)) 1.26 + (commit (:dispatcher context))) 1.27 + 1.28 +(defn preferred-size [component layer context] 1.29 + (let [context (assoc context 1.30 + :font-context (font-context component)) 1.31 + s (size layer context)] 1.32 + (Dimension. (s 0) (s 1)))) 1.33 + 1.34 +(defn make-jpanel 1.35 ([layer] 1.36 - (make-component layer (make-event-dispatcher))) 1.37 + (make-jpanel layer (make-event-dispatcher))) 1.38 ([layer event-dispatcher] 1.39 (let [context (default-context) 1.40 - component 1.41 - (proxy [Component] [] 1.42 - (update [g] (.paint this g)) 1.43 - (paint [g] 1.44 - (let [size (.getSize this) 1.45 - width (.width size) 1.46 - height (.height size) 1.47 - context (assoc context 1.48 - :font-context (.getFontRenderContext g) 1.49 - :dispatcher event-dispatcher 1.50 - :update-fn (make-update-fn this))] 1.51 - (draw! context layer g 0 0 width height false)) 1.52 - (commit event-dispatcher)) 1.53 + context (assoc context :dispatcher event-dispatcher) 1.54 + panel 1.55 + (proxy [JPanel] [] 1.56 + (paintComponent [g] 1.57 + (paint-component this layer context g)) 1.58 (getPreferredSize [] 1.59 - (let [context (assoc context 1.60 - :font-context (font-context this)) 1.61 - s (size layer context)] 1.62 - (Dimension. (s 0) (s 1)))))] 1.63 - (listen! event-dispatcher component) 1.64 - (.setBackground component (-> context :theme :back-color)) 1.65 - component))) 1.66 + (preferred-size this layer context)))] 1.67 + (listen! event-dispatcher panel) 1.68 + (.setBackground panel (-> context :theme :back-color)) 1.69 + panel))) 1.70 1.71 (comment 1.72 (do 1.73 - (def frame (java.awt.Frame. "Test")) 1.74 + (def frame (JFrame. "Test")) 1.75 (def layer1 1.76 (reify Layer 1.77 (render! [this context g] 1.78 @@ -71,12 +74,12 @@ 1.79 (.drawLine g 0 0 (:width context) (:height context)) 1.80 (draw! context layer2 g 15 20) 1.81 (draw! context layer3 g 100 100 80 50)) 1.82 - (size [this context] [300 400]))) 1.83 + (size [this context] [400 300]))) 1.84 (doto frame 1.85 (.addWindowListener 1.86 (proxy [java.awt.event.WindowAdapter] [] 1.87 (windowClosing [event] (.dispose frame)))) 1.88 - (.add (make-component layer)) 1.89 + (.. (getContentPane) (add (make-jpanel layer))) 1.90 (.pack) 1.91 (.setVisible true)) 1.92