6

我在使用 Clojure 和 Seesaw 以功能样式编写事件驱动的 GUI 代码时遇到问题。具体来说,我不知道如何在不使用全局变量或其他一些令人不快的黑客攻击的情况下传递程序的状态。我目前的方法是这样的:

(defn event-handler [gui-state event]
   (update-gui! (get-new-state gui-state event)))

(defn update-gui! [gui-state]
   (remove-all-listeners (gui-state :button))
   (seesaw.core/listen (gui-state :button)
                       :action
                       (partial event-handler gui-state)))

它在相关组件上设置了一个事件侦听器,具有部分应用的功能来推进状态和更新 gui,包括删除旧的侦听器。尽管这似乎可行,但我并不喜欢它,部分原因是我无法在状态中传递侦听器本身(因为直到我已经定义了状态之后才构造它),因此删除旧的侦听器需要删除所有侦听器,这可能会随着程序的增长而导致问题。

我在网上找到的最接近的解决方案是在这个答案中,但我不知道如何将事件作为它显示的流来处理。我确信一定有比我目前的方法更好的解决方案,但我不知道是什么。

谁能告诉我如何在仍然遵循功能样式的同时响应用户输入事件?

4

1 回答 1

1

链接答案中的 Streams 看起来像是 core.async 通道的模拟。

每个事件可能会传入一个包含事件详细信息的通道,而不是删除所有侦听器。相同的通道应该转到按钮的逻辑处理程序,它将被重复从中获取。

于 2015-07-25T02:50:24.647 回答