具有GridBagLayout索引的Clojure序列

时间:2011-04-09 14:41:49

标签: swing clojure gridbaglayout

我正在编写代码来填充带有“行”控件的java.awt.GridBagLayout。对于每一行,我都有一个表单

的方法调用
(.add panel CONTROL (fill-gbc 0 INDEX ...))

其中CONTROL是放置在此行的Swing控件(即:(JLabel. "Hello")),INDEX是该控件的gridyfill-gbc填充单个,可变,{{1对象并返回它 - 它接受GridBagContraintsgridwidth等的关键字可选参数。)

我想创建行内容的向量(gridheight调用)并使用(.add panel ...)填充INDEX值。

我能做到的唯一方法就是让每个(map-indexed ...)成为一个参数(索引)的匿名函数:

(.add panel ...)

有没有更好的方法来实现这一点,也许是使用宏(我的应用程序中需要多次使用这种模式的各种对话框)?

1 个答案:

答案 0 :(得分:2)

你可以把它抽象成一个函数,然后你就可以在任何需要的地方使用它。

(defn add-on-row [panel c]
  (dorun
   (map-indexed
    #(%2 %1)
    [#(.add panel c (fill-gbc 0 %)) ...])))

您只需传递参数即可获取任何不同的信息。

此外,我写了一个小宏来为容器添加一堆东西。

(defmacro add [cmp & things]
  (cons
   'do
   (for [thing things]
     `(.add ~cmp ~@(if (vector? thing) thing [thing])))))

那就让你写下这样的东西:

(add 
 panel 
 [(JLabel. "Hello") "more arguments"] 
 (JLabel "Hello!"))

在这种情况下,不确定这对你是否有帮助,但可能是。