2

我正在编写代码以用“行”控件填充 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 %)) ...]))

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

4

1 回答 1

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!"))

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

于 2011-04-09T17:34:25.773 回答