具有GridBagLayout索引的Clojure序列

我正在编写代码来填充带有“行”控件的java.awt.GridBagLayout。对于每一行,我都有一个表单的方法调用
(.add panel CONTROL (fill-gbc 0 INDEX ...))
其中CONTROL是放置在该行的Swing控件(即:
(JLabel. "Hello")
),INDEX是该控件的
gridy
fill-gbc
填充单个,可变,
GridBagContraints
对象并返回它 - 它接受
gridwidth
gridheight
等的关键字可选参数。) 我想创建行内容的向量(
(.add panel ...)
调用)并使用
(map-indexed ...)
来填充INDEX值。 我能做到的唯一方法就是让每个
(.add panel ...)
成为一个参数(索引)的匿名函数:
(dorun (map-indexed #(%2 %1)
                    [#(.add panel (.JLabel "Hello") (fill-gbc 0 %)) ...]))
有没有更好的方法来做到这一点,也许使用宏(我的应用程序中的各种对话框需要多次这种模式)?     
已邀请:
您可以将其抽象为函数,然后您可以在需要的地方使用它。
(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!"))
在这种情况下,不确定这对你是否有帮助,但它可能是。     

要回复问题请先登录注册