Using Java in Clojure and Lab 3


;; Clojure structures and java methods

;; a structure
(defstruct square :x-coord :y-coord :side)

;; a recursive function that creates the squares
(defn make-squares [x-coord y-coord side min-side]
  (if (< side min-side)
    '()
    (cons (struct square x-coord y-coord side)
	  (make-squares (+ x-coord (/ side 4))
			(+ y-coord (/ side 4))
			(/ side 2)
			min-side))
   )
)

(def squares (make-squares 5 5 380 5))

;; now let's draw them!!!

(defn draw-square [graphics sq]
  (.drawRect graphics (:x-coord sq) (:y-coord sq) (:side sq) (:side sq))
) 

(defn draw-sideways-square [graphics sq]
  (let [half-side (/ (:side sq) 2)
        x-half (+ (:x-coord sq) half-side)
        y-half (+ (:y-coord sq) half-side)
        x-other-side (+ (:x-coord sq) (:side sq))
        y-other-side (+ (:y-coord sq) (:side sq))
       ]
    (.drawLine graphics x-half (:y-coord sq) (:x-coord sq) y-half )
    (.drawLine graphics (:x-coord sq) y-half x-half y-other-side)
    (.drawLine graphics x-half y-other-side x-other-side y-half)
    (.drawLine graphics x-other-side y-half x-half (:y-coord sq))
  )
) 

;; Imports for working with Java
(import '(java.awt Color Dimension Graphics Point BorderLayout Graphics2D))
(import '(javax.swing JPanel JFrame  JLabel))

(def frame (JFrame.)) ; calling the constructor

(def my-panel
 (proxy [JPanel] [] ;; the class extends JPanel
     (repaint [] ;; overwrite the repaint method
       (let [gr (.getGraphics this)] 
         (.setColor gr Color/BLUE)
         (doall (map #(draw-square gr %1) squares))
         (.setColor gr Color/RED)
         (doall (map #(draw-sideways-square gr %1) squares))
         (println "Done") ; debugging print
      )    
  )
 ))


(.setPreferredSize my-panel (Dimension. 400 400))

;; a sequence of methods on JFrame
(doto frame
  (.setSize 420 420)
  (.add my-panel BorderLayout/CENTER)
  (.add (JLabel. "    Draw squares") BorderLayout/SOUTH)
  (.pack)
  (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
  (.setVisible true)
  )

;; wait for a bit and then paint. Otherwise threads don't work right
(Thread/sleep 500)
(.repaint my-panel)


UMM CSci 4409