Clojure 如果我没有';你没有保留返回功能吗?

Clojure 如果我没有';你没有保留返回功能吗?,clojure,seesaw,Clojure,Seesaw,要将侦听器添加到Seesaw中的UI元素,请执行以下操作: (listen ui-element :action (fn [_] (...))) listen附加一个侦听器,该侦听器在“ui-element1”上触发:action时调用提供的函数。它还返回一个函数。如果执行该函数,它将删除与原始调用一起添加的侦听器 我一直在使用跷跷板在REPL中创建ui原型,并且没有保留listen中的返回值 如果没有返回的函数,如何删除侦听器?如果没有该函数引用,则无法执行此操作。您可以使用REPL中的*1

要将侦听器添加到Seesaw中的UI元素,请执行以下操作:

(listen ui-element :action (fn [_] (...)))
listen
附加一个侦听器,该侦听器在“ui-element1”上触发
:action
时调用提供的函数。它还返回一个函数。如果执行该函数,它将删除与原始调用一起添加的侦听器

我一直在使用跷跷板在REPL中创建ui原型,并且没有保留
listen
中的返回值


如果没有返回的函数,如何删除侦听器?

如果没有该函数引用,则无法执行此操作。您可以使用REPL中的
*1
特殊vara(它基本上存储最后执行的表达式的结果)从REPL中删除处理程序

您可以通过以下方式手动删除侦听器:

user=> (def b (button :text "HI"))
user=> (listen b :action #(alert % "HI!"))
user=> (-> (frame :content b) pack! show!)
; click the button, see the alert
; manually remove listeners
user=> (doseq [l (.getActionListeners b)] (.removeActionListener b l))
; click the button, nothing happens

您可以将其放入助手函数中,并在任何时候使用它。以某种方式将此内置到
seesaw.event
seesaw.dev
也会很好。(:)

是的,不过在本例中,我已经在REPL中向前移动了太远,因此也丢失了那些引用。这在
按钮上起作用,但在
列表框上不起作用,该列表框在
:selection
事件上有一个侦听器,如中所示。在这种情况下,我只是用相同的选项重新创建了listbox,然后将框架的内容设置为新的listbox。