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