首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Clojure中用动态创建的小部件替换SeeSaw小部件?

如何在Clojure中用动态创建的小部件替换SeeSaw小部件?
EN

Stack Overflow用户
提问于 2014-05-28 14:36:07
回答 2查看 361关注 0票数 2

我是Clojure、Java和函数式编程的新手。我开始在图形用户界面上使用SeeSaw,并且非常喜欢它。使用来自Dave Ray的示例,我创建了一个小部件:

代码语言:javascript
复制
(defrecord Col-definition [id col-name col-position])

使用相关的函数来创建组合框、标签和文本框,最主要的是使用extend-type

代码语言:javascript
复制
(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实例构建的,绑定到屏幕区域如下:

代码语言:javascript
复制
(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)或任何其他聪明的想法都是徒劳的。

所以这里有一个问题:在触发事件(比如单击文件路径加载)之后,如何替换或删除自定义小部件?

EN

回答 2

Stack Overflow用户

发布于 2014-06-01 08:05:48

在尝试了一周的各种方法之后,我有了一个解决方案,尽管有一点小技巧。

关键思想是具体使用id关键字作为标记和查找小部件的一种方式。

首先,为了让一切顺利进行,我创建了一个“虚拟”小部件,“将它添加到一个名为areabottom的JFrame区域中,这是因为以后必须要替换一些东西。

代码语言:javascript
复制
(def initcombos (combobox  :id "newcombo" :model [ 1 2 3 ]))
(add! areabottom initcombos)

然后-I修改了listbox listener并实现了replace!按如下方式使用id关键字:

代码语言:javascript
复制
 (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,以确保在进一步的调用中可以找到它。希望这能对你有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-06-30 09:36:01

自从你发布这篇文章以来,已经有一段时间了。我几分钟前看过这篇文章,因为我在replace!上也遇到了同样的问题,没有做我期望的事情。我没有继续使用replace!,而是使用了像(do (config! my-container :items (build-new-items)) (repaint! my-container))这样的东西。如果你仍然想要整理你的代码,你可能会想尝试一下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23904359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档