gpt4 book ai didi

java - 如何用 Clojure 中动态创建的 Seesaw 小部件替换?

转载 作者:行者123 更新时间:2023-11-30 08:23:08 25 4
gpt4 key购买 nike

我是 Clojure、Java 和函数式编程的新手。我开始使用用于 GUI 的 SeeSaw 并喜欢它。使用 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 second-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 中的 combo 与之前的“虚拟”小部件具有相同的 ID,即“newcombo”。这是一个神奇的 hack,因此相同的 id 用于查找旧的 widget,而新的 widget 具有相同的 id,以确保可以在以后的调用中找到它。希望这对您有所帮助。

关于java - 如何用 Clojure 中动态创建的 Seesaw 小部件替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23904359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com