>我用跷跷板创建了一个java框架
(def f (frame :title "my app"))
我想抓住用户按键。
我试图在这里和那里收集代码,并以这个结束
(ns myapp.core
(:use seesaw.core)
(:use seesaw.font)
(:import [java.awt.event ActionListener KeyListener KeyEvent])
)
(defn input-listener []
(proxy [ActionListener KeyListener] []
(actionPerformed [e])
(keyPressed [e] (alert e "You pressed a key!"))
(keyReleased [e])
(keyTyped [e])))
(doto f
(.addKeyListener (input-listener)))
但它根本行不通。我是 clojure 的新手,因为我完全不了解 JAVA(并且真的不想进入它),所以我有点迷茫。有没有一种简单的方法可以在整个应用程序中捕获用户输入的键盘快捷键?
请帮忙。
如果您只想将特定的按键映射到框架中的不同功能,那么 seesaw.keymap/map-key 可能是您想要的:
; When 'e' is pressed in frame f, call this function
(map-key f "e" (fn [_] (... do something ))
(这一切都建立在键绑定内容@Bill引用之上)
有关详细信息,请查看map-key
文档。正如其他答案所暗示的那样,Swing 中的键盘处理甚至比 Swing 的其他部分更糟糕,因此请准备好接受一些痛苦:)
跷板很棒,但找到如何做你想做的事情仍然有点棘手,特别是如果(像我一样)你不是 Swing 专家。 通常不需要闯入Java API,特别是对于这么简单的事情。 以下是对我有用的方法:
(ns so.core
(:use seesaw.core))
(let [f (frame :title "my app")
handler (fn [e] (alert "pressed key!"))]
(listen f :key-pressed handler)
(show! f))
不幸的是,这个不错的跷跷板教程没有按键示例 - 最好添加。
swing 应用程序中全局拦截键,则需要一个 KeyEventDispatcher
,您将通过 KeyboardFocusManager
注册该键。如果要将基于键的操作添加到特定组件(级别要高得多 - 更好),则可能需要键绑定 http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
不过,在学习跷跷板之前,您想了解一点摇摆。 Java Trail 是一个很好的起点。http://docs.oracle.com/javase/tutorial/uiswing/index.html
你在警报调用中得到了一个 e,它实际上不属于那里。应该在没有它的情况下工作。祝你好运,在不学习Java的情况下尝试使用Clojure,我认为从长远来看它不会成功,但如果它成功了,那就太好了。