http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html#getKeyCode()
我不知道如何测试按下的键是否为Enter。使用以下样板和(alert ...)
。我已经设法确定事件e是一个KeyEvent,从documentation我看到有一个常量VK_Enter
代表Enter和三个方法 getKeyChar ,< strong> getKeyCode 和 getKeyText 。使用(alert e)
看来getKeyChar返回Enter,或者至少用Enter String表示的东西,但(= (.getKeyChar e) "Enter")
返回false。如何检测Enter被按下?
(-> (frame :title "Zangalon" :content
(text :text "Input Goes here"
:listen [:key-typed (fn [e] ..)]))
pack!
show!)
VK_ENTER
答案 0 :(得分:7)
一个工作示例:
(ns user
(:require [seesaw.core :as ui]))
(defn keypress [e]
(let [k (.getKeyChar e)]
(prn k (type k))
(if (= k \newline)
(prn "ENTER!")
(prn "some other key"))))
(defn run []
(-> (ui/frame :title "Zangalon" :content
(ui/text :text "Input Goes here"
:listen [:key-typed keypress]))
ui/pack!
ui/show!))
和输出:
\q java.lang.Character
"some other key"
\w java.lang.Character
"some other key"
\e java.lang.Character
"some other key"
\newline java.lang.Character
"ENTER!"
\newline java.lang.Character
"ENTER!"
活动本身是:
#<KeyEvent java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Enter,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=10,scancode=0,extendedKeyCode=0x0] ...>
正如您所见,keyCode为0,因此.getKeyCode将无效。
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
答案 1 :(得分:3)
检查字符=
\newline
user> (java.net.URLDecoder/decode "%00")
true
所以
...
(fn [e] (= \newline (.getKeyChar e))
答案 2 :(得分:2)
试试这个:
(fn [e]
(if (= java.awt.event.KeyEvent/VK_ENTER (.getKeyCode e))
...)
编辑: (基于与@edbond在评论中的对话)
TLDR:对getKeyChar
事件使用:key-typed
,getKeyCode
或:key-released
使用:key-pressed
;根据您的使用情况,三种类型的事件中的任何一种都可能是合适的。
引用KeyEvent
的{{3}}:
“键入类型”事件是更高级别的,通常不依赖于平台或键盘布局。它们是在输入Unicode字符时生成的,是查找字符输入的首选方法。在最简单的情况下,通过单键按压(例如,'a')产生键类型事件。然而,通常,字符是由一系列按键(例如,'shift'+'a')产生的,并且从按键事件到键控事件的映射可以是多对一或多对多。生成密钥类型事件通常不需要密钥版本,但在某些情况下,在释放密钥之前不会生成密钥类型事件(例如,通过Windows中的Alt-Numpad方法输入ASCII序列)。没有为不生成Unicode字符的键(例如,操作键,修饰键等)生成键类型事件。
getKeyChar方法始终返回有效的Unicode字符或CHAR_UNDEFINED。 KEY_TYPED事件报告字符输入:KEY_PRESSED和KEY_RELEASED事件不一定与字符输入相关联。因此, getKeyChar方法的结果保证仅对KEY_TYPED事件有意义。
对于按键和键释放事件,getKeyCode方法返回事件的keyCode 。对于键类型事件,getKeyCode方法始终返回VK_UNDEFINED。 getExtendedKeyCode方法也可以与许多国际键盘布局一起使用。
“按下按键”和“按键释放”事件是较低级别的,取决于平台和键盘布局。无论何时按下或释放按键都会生成它们,并且这是查找不生成字符输入的按键(例如,动作按键,修改键等)的唯一方法。按下或释放的键由getKeyCode和getExtendedKeyCode方法指示,这些方法返回虚拟键代码。