2015-07-09 64 views
2

我试图听我的跷跷板框架上的键盘按键和键盘释放事件,但事件没有发射。我将问题缩小到了列表框 - 当列表框出现时,框架不再捕获关键事件。这里是我的代码的简化版本,显示的行为:跷跷板重点事件没有触发

(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

我在跷跷板的Google Group发布了这个问题,并从Seesaw的创建者Dave Ray自己那里得到了很好的回答。我在这里发布它,以防其他人遇到此问题:

“嗨,一旦像列表框那样在层次结构中存在另一个小部件,它就会抓住键盘焦点,因此事件永远不会到达框架。选择将是把一个嵌套插件的按键侦听器像一个面板,然后给它输入焦点的一种类似的例子可以看这里:

https://github.com/daveray/regenemies/blob/master/src/regenemies/ui.clj#L163

:键类型的事件势必画布然后使用.requestFocusInWindow来给它键盘焦点。“

非常感谢,戴夫!