Clojure 跷跷板关键事件未触发

Clojure 跷跷板关键事件未触发,clojure,seesaw,Clojure,Seesaw,我试图在我的跷跷板框架上收听:按键按下和:按键释放事件,但这些事件没有触发。我已经将问题缩小到一个listbox——当listbox存在时,帧不再捕获关键事件。下面是我的代码的简化版本,它显示了以下行为: (ns ainur.example (:use seesaw.core)) (let [lst (listbox :model ["Chiptune" "Sinewave"]) f (frame :title "Ainur" :on-close :e

我试图在我的跷跷板框架上收听:按键按下和:按键释放事件,但这些事件没有触发。我已经将问题缩小到一个listbox——当listbox存在时,帧不再捕获关键事件。下面是我的代码的简化版本,它显示了以下行为:

(ns ainur.example
  (:use seesaw.core))

(let [lst (listbox :model ["Chiptune" "Sinewave"])
      f (frame :title "Ainur"
             :on-close :exit
             :size [1024 :by 768]
             :content (border-panel :hgap 10 :vgap 10
                                    :center (label "Center")
                                    :north (label "North")
                                    :south (label "South")
                                    :west lst))]
(listen lst :selection (fn [e]
                         (let [active-inst (selection e)]
                           (println active-inst))))
(listen f
        :key-pressed (fn [e]
                       (println "Key pressed"))
        :key-released (fn [e]
                        (println "Key released")))
(invoke-later
 (native!)
 (show! f)))

有人能帮我弄清楚为什么没有触发关键事件吗?任何帮助都将不胜感激。提前谢谢

我在seesaw的Google Group上发布了这个问题,并从seesaw的创建者Dave Ray那里得到了非常好的回答。我将其张贴在此处,以防其他人遇到此问题:

“嗨,一旦层次结构中有了另一个小部件(如listbox),它就会抓住键盘焦点,这样事件就永远不会进入框架。我认为最好的办法是将按键侦听器放在一个嵌套的小部件(如面板)上,然后给它键盘焦点。这里可以看到类似的示例:

:key-typed事件绑定到画布,然后使用.requestFocusInWindow为其提供键盘焦点。“

非常感谢,戴夫