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