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

时间:2014-05-28 06:36:07

标签: java swing clojure seesaw

我是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)或任何其他聪明的想法都已无用。

所以这就是问题:在触发事件后(如单击要加载的文件路径),如何替换或删除自定义窗口小部件?

2 个答案:

答案 0 :(得分:2)

经过一周的尝试各种各样的事情,我有一个解决方案,虽然有点黑客。

关键的想法是使用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)
           )))) 

请注意ncombo中的let与前一个"虚拟&#34}具有相同的ID小部件,即" newcombo。"这是神奇的黑客攻击,因此使用相同的id来查找旧的小部件,并且新小部件具有相同的ID,以确保可以在进一步的调用中找到它。希望这有用。

答案 1 :(得分:1)

自从您发布此内容以来已经有一段时间了。我几分钟前看过这篇文章,因为replace!没有按照我的预期做同样的问题。我没有继续使用replace!,而是使用类似(do (config! my-container :items (build-new-items)) (repaint! my-container))的内容。如果您仍希望整理代码,可能需要尝试此操作。