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:
- Swinging Clojure (1)
- Swinging Clojure (3)
- TCPサーバ ruby と python
- scheme で TCP エコーサーバ
- ハノイとバベルの塔 第九階 – 端末アニメ in Clojure