我是 Clojure、Java 和函数式编程的新手。我开始使用 SeeSaw GUI 并喜欢它。使用 Dave Ray 中的示例我创建一个小部件:
(defrecord Col-definition [id col-name col-position])
使用相关函数来创建组合框、标签和文本框,最显着的是使用extend-type
:
(extend-type Col-definition
MakeWidget
(make-widget* [col-definition]
(mig-panel
:constraints ["", "[][grow]"]
:border [(line-border :thickness 1) 2]
:items [["Column Name" "gap 10"]
;;[(col-name-field (:id col-definition) col-definition :col-name) "growx, wrap"]
[(:col-name col-definition) "growx, wrap"]
["Ordinal Position" "gap 10"]
[(col-name-field (:id col-definition) col-definition :col-position) "growx"]])))
小部件是通过 defrecord
的实例构建的,绑定(bind)到屏幕区域,如下所示:
(def second-combocoll '("Col0" "Col1" "Col2"))
(def second-bottom (vertical-panel :items (vec (col-defs second-combocoll))))
(def areabottom second-bottom)
其中areabottom
是房地产的分割区域。一切都很好。
但我想从数据库中读入并用新的组合框集合动态替换小部件。
我似乎无法删除小部件,(remove!areabottom secondary-combocol)
或 (replace!areabottom new-combocol)
或任何其他聪明的想法却一无所获。
问题是:在触发事件(例如单击要加载的文件路径)后,如何替换或删除自定义小部件?
最佳答案
经过一周的尝试,我提供了一个解决方案,尽管有点破解。
关键思想在于具体使用 id
关键字作为标记然后查找小部件的方式。
首先,为了让事情顺利进行,我创建了一个“虚拟”小部件,”将其添加到名为 areabottom
的 JFrame 区域。这是因为稍后必须有一些东西需要替换。
(def initcombos (combobox :id "newcombo" :model [ 1 2 3 ]))
(add! areabottom initcombos)
-然后我修改了列表框监听器并实现了替换!使用 id 关键字如下:
(listen lb
:selection
(fn [e]
(when-let [s (selection e)]
(let [ncombo (vertical-panel :id "newcombo" :items (get-col-defs (.getPath s)))]
; (replace! areabottom initcombos ncombo)
(replace! areabottom (select areabottom [:#newcombo]) ncombo)
))))
请注意,let
中的 ncombo
与之前的“虚拟”小部件具有相同的 id,即“newcombo”。这是一个神奇的技巧,因此相同的 id 用于查找旧的小部件,并且新的小部件具有相同的 id,以确保可以在进一步的调用中找到它。希望这对您有所帮助。
关于java - 如何用 Clojure 中动态创建的小部件替换 SeeSaw 小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23904359/