4

我用跷跷板创建了一个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 (也不想真正投入其中),所以我有点迷路了。有没有一种简单的方法来捕获整个应用程序中键盘快捷键的用户输入?

请帮忙。

4

4 回答 4

4

如果您只想将特定按键映射到框架中的不同功能,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 的其余部分更糟糕,所以要准备好承受一些痛苦:)

于 2012-11-15T05:41:32.423 回答
3

跷跷板很棒,但要找到如何做你想做的事情仍然有点棘手,特别是如果(像我一样)你不是 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))

不幸的是,这个不错的跷跷板教程没有按键示例——最好添加。

于 2012-11-14T14:51:00.980 回答
3

如果你想在一个 Swing 应用程序中全局拦截键,你需要一个KeyEventDispatcher,你可以通过KeyboardFocusManager. 如果您想根据特定组件的键添加操作(更高级别 - 更好),您可能需要 KeyBindings http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

在你学习跷跷板之前,你想了解一点摇摆。Java Trail 是一个很好的起点。http://docs.oracle.com/javase/tutorial/uiswing/index.html

于 2012-11-14T15:35:12.777 回答
0

你在你的警报呼叫中得到了一个并不真正属于那里的 e。没有它应该可以工作。在不学习 Java 的情况下尝试使用 Clojure 祝你好运,我认为从长远来看它不会奏效,但如果它确实会很好。

于 2012-11-14T09:45:37.287 回答