【问题标题】:How to replace a SeeSaw widget with a dynamically created one in Clojure?如何用 Clojure 中动态创建的小部件替换 SeeSaw 小部件?
【发布时间】:2014-05-28 06:36:06
【问题描述】:

我是 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 的实例构建的,因此绑定到屏幕区域:

(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) 或任何其他聪明的想法都付诸东流。

那么问题来了:如何在触发事件(例如单击要加载的文件路径)后替换或删除自定义小部件?

【问题讨论】:

    标签: java swing clojure seesaw


    【解决方案1】:

    在尝试了一周的各种事情之后,我有一个解决方案可以提供,尽管有点小技巧。

    关键思想在于具体使用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 与之前的“虚拟”小部件(即“newcombo”)具有相同的ID。这是一个神奇的技巧,因此相同的 id 用于查找旧的小部件,而新的小部件具有相同的 id,以确保在进一步调用时可以找到它。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      你已经有一段时间没有发布这个了。几分钟前我看了这篇文章,因为我遇到了同样的问题,replace! 没有达到我的预期。我没有继续使用replace!,而是使用了(do (config! my-container :items (build-new-items)) (repaint! my-container)) 之类的东西。如果您仍想整理代码,不妨试试这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        相关资源
        最近更新 更多