res*_*man 5 events user-interface functional-programming clojure seesaw
我在使用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)))
Run Code Online (Sandbox Code Playgroud)
它在相关组件上设置一个事件监听器,并使用部分应用的函数来推进状态并更新gui,包括删除旧的监听器.虽然这似乎有效,但我并不喜欢它,部分是因为我无法在状态中传递监听器(因为它在我已经定义状态之后才构建),所以删除旧的监听器需要删除所有侦听器,这可能会在程序增长时导致问题.
我在网上找到的最接近的解决方案是在这个答案中,但我不知道如何像它显示的那样处理事件.我确信必须有一个比我目前的方法更好的解决方案,但我无法弄清楚是什么.
任何人都可以告诉我如何在仍然遵循功能风格的同时响应用户输入事件?
链接答案中的流看起来像是 core.async 通道的模拟。
每个事件可以传入一个包含事件详细信息的通道,而不是删除所有侦听器。相同的通道应该进入按钮的逻辑处理程序,从中重复获取该通道。
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |