2

我正在尝试在我的 Seesaw 框架上收听 :key-pressed 和 :key-released 事件,但这些事件没有触发。我已将问题缩小到列表框——当列表框存在时,框架不再捕获关键事件。这是我的代码的简化版本,显示了该行为:

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

谁能帮我弄清楚为什么没有触发关键事件?任何帮助将非常感激。提前致谢!

4

1 回答 1

0

我在 seesaw 的 Google Group 中发布了这个问题,并得到了 Seesaw 的创建者 Dave Ray 本人的出色回答。我把它贴在这里,以防其他人遇到这个问题:

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

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

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

非常感谢,戴夫!

于 2015-07-09T21:47:33.047 回答