bean函数不返回完整的属性映射

时间:2011-12-01 17:07:38

标签: user-interface clojure javabeans awt

继续爬上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 个答案:

答案 0 :(得分:5)

我想,这是因为(bean)函数使用JavaBean conventions。这意味着对于每个属性,你应该有getter和setter,所以在GridBagConstraint中我们没有getter来获取你需要的值。

您可以通过简单的点访问来获取和设置不具有getter的特定属性:

user> (. gbc gridx)
-1
user> (set! (. gbc gridx 10))
10

答案 1 :(得分:0)

正如mishadoff的回答所说GridBagConstraints没有吸气剂。它使用直接访问属性字段,因此它不适合" beanable"。

可以通过直接java互操作使用java introspection发现属性字段。


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

扩展答案

以下内容将使用反射来过滤掉"魔术数字"之后构建一个fieldname,fieldvalue对的映射。声明为静态最终:


(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}