ALGOBIT > 離散的な気まぐれ

2011/09/30

Swinging Clojure (2)

Filed under: 離散的な気まぐれ — タグ: , — Kohyama @ 10:39

Clojure から Swing を使います.
今回は, レイアウトの適用.

(import '(javax.swing JFrame JButton))
(import 'java.awt.BorderLayout)
(let [f (JFrame. "Swinging Clojure (2)")
      p (. f getContentPane)]
  (. p setLayout (BorderLayout.))
  (dorun
    (map
      (fn [[c l]] (. p add c l))
      [[(JButton. "PAGE_START") BorderLayout/PAGE_START]
       [(JButton. "LINE_START") BorderLayout/LINE_START]
       [(JButton. "CENTER")     BorderLayout/CENTER]
       [(JButton. "LINE_END")   BorderLayout/LINE_END]
       [(JButton. "PAGE_END")   BorderLayout/PAGE_END]]))
  (doto f
    (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
    (.setLocationByPlatform true)
    (.setSize 400 300)
    (.setVisible true)))

6行目〜 (dorun (map のところは,

(. p add (JButton. "PAGE_START") BorderLayout/PAGE_START)
(. p add (JButton. "LINE_START") BorderLayout/LINE_START)
(. p add (JButton. "CENTER")     BorderLayout/CENTER)
(. p add (JButton. "LINE_END")   BorderLayout/LINE_END)
(. p add (JButton. "PAGE_END")   BorderLayout/PAGE_END)

と同じで, これだけだと全部書いても記述量は変わりませんが, 共通部分をまとめる練習ということで.
map は遅延評価リストを返すので, そのままでは map が返した結果を直接または間接に出力しようとしないと, 中身は評価されません.
評価を強制するには dorun か doall を使います.
副作用のみが目的の今回は, map の返すリストを返さない dorun を使います.
(doall は map が返す結果を返します.)

13行目〜 doto [x & forms] は, x を forms の全てのフォームの二番目(つまりフォームが関数呼び出しなら, 最初の引数) の要素に挿入してくれる. つまり,

(.setDefaultCloseOperation f JFrame/EXIT_ON_CLOSE)
(.setLocationByPlatform f true)
(.setSize f 400 300)
(.setVisible f true))

ということ.
これだけだと記述量は変わらないけど, 練習ということで.

(. f setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(. f setLocationByPlatform true)
(. f setSize 400 300)
(. f setVisible true))

と書いても同じ.

BorderLayout やその他のレイアウトの詳細は
How to Use BorderLayout の辺りが分かりやすいです.

Related Posts:

コメントをどうぞ

*

Copyright © 2010 Yoshinori Kohyama All Rights Reserved.