无法从跷跷板监听器功能中访问或更新原子

nan*_*sen 1 clojure seesaw

我有一个带文本编辑器的跷跷板ui.编辑器内容由名为"Task"的记录支持,该记录包含在名为"state"的原子中.编辑器上的密钥释放事件应该更改属性:任务的desc.我使用以下代码:

(def state
     (atom {:tasks []
            :interval nil
            :style (style :foreground :black :background nil)}))

(defn on-text-edited [ui listener-fn]
  (let [editor (select ui [:#editor])]  
    (listen editor :key-released
        (fn [evt] (listener-fn (text editor))))))

(defn update-task! [task text]
  (let [newtask (assoc task :desc text)
        tasks (replace {task newtask} (:tasks @state))]
  (swap! state
     #(assoc % :tasks tasks))))

(def text-updates (on-text-edited frame #(update-task! selected-task %)))
Run Code Online (Sandbox Code Playgroud)

selected-task是一个引用编辑器当前内容模型的atom.每当用户编辑更新任务的文本时!函数应该被调用.但没有任何反应.该函数似乎根本没有被调用.当我从repl调用它时,它的行为与预期一致.

我测试了函数是否会通过让它执行一个简单的println来调用它:

(defn update-task! [task text]
   (println (str task " " text)))
Run Code Online (Sandbox Code Playgroud)

现在,当我在编辑器中编辑文本时,该功能正常工作.然后我把它改为:

(defn update-task! [task text]
  (let [newtask (assoc task :desc text)
        tasks (replace {task newtask} (:tasks @state))]
     (println (str task " " text))))
Run Code Online (Sandbox Code Playgroud)

再说一遍,它什么都不做.所以似乎不知何故原子的访问妨碍了事件处理.ui线程与原子定义的线程之间是否存在冲突?

Dav*_*Ray 5

在这样的地方工作在简单的情况下,停止在更复杂的情况下的情况下,我猜,在有发生异常,可能assoc还是replacelet绑定.根据您的开发环境,异常可能会隐藏,因为它发生在UI线程上.

我建议尝试调用seesaw.dev/debug!哪个会在UI线程中抛出未处理的异常时弹出带有堆栈跟踪的ui.