1

我有一个带有文本编辑器的跷跷板用户界面。编辑器内容由称为“任务”的记录支持,该记录包含在称为“状态”的原子中的某处。编辑器上的键释放事件应更改任务的属性 :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 %)))

selected-task是一个引用编辑器当前内容模型的原子。每当用户编辑文本时,更新任务!函数应该被调用。但什么也没有发生。该函数似乎根本没有被调用。当我从 repl 调用它时,它的行为符合预期。

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

(defn update-task! [task text]
   (println (str task " " text)))

现在,当我在编辑器中编辑文本时,该功能可以正常工作。然后我将其更改为:

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

现在再一次,它什么都不做。因此,原子的访问似乎以某种方式妨碍了事件处理。ui线程和定义原子的线程之间是否存在冲突?

4

1 回答 1

5

在这种情况下,它在简单的情况下工作并在更复杂的情况下停止,我猜可能会发生异常,可能在绑定中assoc或绑定中。根据您的开发环境,异常可能会被隐藏,因为它发生在 UI 线程上。replacelet

我建议尝试调用seesaw.dev/debug!which 将在 UI 线程中引发未处理的异常时弹出一个带有堆栈跟踪的 ui。

于 2012-04-06T17:01:37.993 回答