Последовательность закрытия с индексом для GridBagLayout - PullRequest
2 голосов
/ 09 апреля 2011

Я пишу код для заполнения 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 %)) ...]))

Есть ли лучший способ сделать это, возможно, с помощью макроса (мне понадобится этот шаблон несколько раз в моем приложении для различных диалоговых окон)?

1 Ответ

2 голосов
/ 09 апреля 2011

Вы можете абстрагировать это в функцию, а затем использовать в любом месте.

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

Не уверен, что это поможет вам в этой ситуации, но это может быть.

...