我试图在我的跷跷板框架上听取:按键和:键释放的事件,但事件并未触发。我已将问题缩小到列表框 - 当列表框存在时,框架不再捕获关键事件。这是我的代码的简化版本,显示了行为:
(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)))
任何人都可以帮我弄清楚为什么关键事件没有被触发?任何帮助将非常感激。提前谢谢!
答案 0 :(得分:0)
我在跷跷板的谷歌集团发布了这个问题,并从跷跷板的创作者戴夫雷本人那里得到了很好的回答。我在这里发帖,以防其他人遇到这个问题:
“嗨。一旦层次结构中的另一个小部件像列表框一样,它会抓住键盘焦点,因此事件永远不会到达框架。我认为最好的办法是将关键监听器放在嵌套小部件上,如面板和然后给它键盘焦点。这里可以看到一种类似的例子:
https://github.com/daveray/regenemies/blob/master/src/regenemies/ui.clj#L163
:键入类型的事件绑定到画布,然后使用.requestFocusInWindow为其提供键盘焦点。“
非常感谢,戴夫!