跷跷板键事件未触发

时间:2015-07-09 20:45:12

标签: clojure seesaw

我试图在我的跷跷板框架上听取:按键和:键释放的事件,但事件并未触发。我已将问题缩小到列表框 - 当列表框存在时,框架不再捕获关键事件。这是我的代码的简化版本,显示了行为:

(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)))

任何人都可以帮我弄清楚为什么关键事件没有被触发?任何帮助将非常感激。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我在跷跷板的谷歌集团发布了这个问题,并从跷跷板的创作者戴夫雷本人那里得到了很好的回答。我在这里发帖,以防其他人遇到这个问题:

“嗨。一旦层次结构中的另一个小部件像列表框一样,它会抓住键盘焦点,因此事件永远不会到达框架。我认为最好的办法是将关键监听器放在嵌套小部件上,如面板和然后给它键盘焦点。这里可以看到一种类似的例子:

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

:键入类型的事件绑定到画布,然后使用.requestFocusInWindow为其提供键盘焦点。“

非常感谢,戴夫!