функция bean не возвращает полную карту свойств - PullRequest
1 голос
/ 01 декабря 2011

Продолжайте сканировать на Clojure и теперь с Java GUI.Как я могу получить карту свойств для GridBagConstrains?Функция bean не возвращает полную карту с :gridx, :gridy, :fill и т. Д. ...

user=> (import '(java.awt GridBagConstraints))
java.awt.GridBagConstraints
user=> (def gbc (GridBagConstraints.))
#'user/gbc
user=> (bean gbc)
{:class java.awt.GridBagConstraints}

Как всегда, заранее спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Полагаю, это происходит потому, что функция (bean) использует Соглашения JavaBean . Это означает, что для каждого свойства у вас должны быть методы getter и setter, поэтому в GridBagConstraint у нас нет методов получения значений, которые вам нужны.

Вы можете получить и установить определенные свойства без геттеров простым простым доступом к ним:

user> (. gbc gridx)
-1
user> (set! (. gbc gridx 10))
10
0 голосов
/ 02 декабря 2011

В ответе mishadoff говорится, что GridBagConstraints не имеет геттеров. Он использует прямой доступ к полям свойств, поэтому он не может быть корректно обработан.

Можно обнаружить поля свойств с помощью самоанализа Java через прямое взаимодействие с Java.


(doseq [f (.. gbc (getClass) (getFields))] 
   (println (.getName f)))

Расширенный ответ

Следующее будет использовать отражение для построения карты пар полей и значений полей после фильтрации «магических чисел», объявленных как static final:


(defn lookup-fields [obj]
 (letfn [(isStaticFinal [field]
       (let [mods (.getModifiers field)]
         (and (java.lang.reflect.Modifier/isStatic mods)
              (java.lang.reflect.Modifier/isFinal mods))))]
    (into {}
      (for [f (.. obj (getClass) (getFields)) 
              :when ((complement isStaticFinal) f)]
        [(keyword (.getName f)) (.get f obj)]))))


user=> (lookup-fields gbc)
{:gridx -1, :gridwidth 1, :ipadx 0, :ipady 0, :anchor 10,
 :weighty 0.0, :gridheight 1, :weightx 0.0, :fill 0, 
 :insets #Insets java.awt.Insets[top=0,left=0,bottom=0,right=0], 
 :gridy -1}
...