继续爬上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}
一如既往地感谢您的帮助。
答案 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}