我试图在我的跷跷板框架上收听:键按和:键释放事件,但事件没有发射。我已经将问题缩小到一个列表框——当列表框出现时,框架不再捕获关键事件。下面是我的代码的简化版本,它显示了这种行为:
(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组里,seesaw的创建者Dave Ray给了我一个很好的回答。我把它贴在这里,以防其他人遇到这个问题:
"嗨。一旦层次结构中有另一个小部件(如列表框),它就会捕获键盘焦点,因此事件永远不会到达框架。我认为最好的办法是把键监听器放在嵌套的小部件上,比如面板,然后给它键盘焦点。下面是一个类似的例子:
https://github.com/daveray/regenemies/blob/master/src/regenemies/ui.clj L163
key-typed事件被绑定到画布上,然后. requestfocusinwindow被用来给它键盘焦点。" 非常感谢,Dave!