等待clojure中的按键

时间:2012-11-14 06:38:00

标签: java input clojure lisp seesaw

我创建了一个带有seesaw的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 个答案:

答案 0 :(得分: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的其余部分更糟糕,所以要为一些痛苦做好准备:)

答案 1 :(得分: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))

不幸的是this nice Seesaw tutorial没有按键示例 - 最好添加。

答案 2 :(得分: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

答案 3 :(得分:0)

你的电话中有一个警报,它并不真正属于那里。应该没有它。祝你在不学习Java的情况下尝试使用Clojure好运,我认为从长远来看它不会有用,但如果确实如此,它会很好。