Swing Clojure';s跷跷板:如何识别已按下回车键
我不知道如何测试按下的键是否为Enter。使用以下锅炉板和Swing Clojure';s跷跷板:如何识别已按下回车键,swing,clojure,seesaw,Swing,Clojure,Seesaw,我不知道如何测试按下的键是否为Enter。使用以下锅炉板和(警报…)。我已经设法确定了事件e是一个KeyEvent,从中我看到有一个常量VK\u Enter来表示Enter和三种方法getKeyChar,getKeyCode和getKeyText。使用(警报e)时,getKeyChar似乎返回Enter,或者至少返回由Enter字符串表示的内容,但(=(.getKeyChar e)“Enter”)返回false。我如何检测到按下了Enter键 (-> (frame :title "Zang
(警报…
)。我已经设法确定了事件e是一个KeyEvent,从中我看到有一个常量VK\u Enter
来表示Enter和三种方法getKeyChar,getKeyCode和getKeyText。使用(警报e)
时,getKeyChar似乎返回Enter,或者至少返回由Enter字符串表示的内容,但(=(.getKeyChar e)“Enter”)
返回false。我如何检测到按下了Enter键
(-> (frame :title "Zangalon" :content
(text :text "Input Goes here"
:listen [:key-typed (fn [e] ..)]))
pack!
show!)
VK_输入检查字符
=
是否为\newline
user> (java.net.URLDecoder/decode "%00")
true
所以
试试这个:
(fn [e]
(if (= java.awt.event.KeyEvent/VK_ENTER (.getKeyCode e))
...)
编辑:(基于评论中与@edbond的对话) TLDR:使用
getKeyChar
处理:键入的键
事件,使用getKeyCode
处理:释放的键
或:按下的键
;根据您的用例,三种类型的事件中的任何一种都可能是合适的
引用KeyEvent
:
“按键类型”事件是更高级别的事件,通常不依赖于平台或键盘布局。它们是在输入Unicode字符时生成的,是了解字符输入的首选方法。在最简单的情况下,按键类型的事件是由单个按键(例如“a”)产生的。但是,通常情况下,字符是由一系列按键(例如,“shift”+“a”)产生的,按键事件到按键类型事件的映射可能是多对一或多对多。生成键类型的事件通常不需要释放键,但在某些情况下,直到释放键后才会生成键类型的事件(例如,在Windows中通过Alt Numpad方法输入ASCII序列)。对于不生成Unicode字符的键(例如,动作键、修改键等),不会生成键类型的事件
getKeyChar方法始终返回有效的Unicode字符或未定义的字符。字符输入由按键类型事件报告:按键按下和按键释放事件不一定与字符输入关联。因此,getKeyChar方法的结果保证仅对键类型的事件有意义
对于按键按下和按键释放事件,getKeyCode方法返回事件的keyCode。对于键类型的事件,getKeyCode方法始终返回VK_UNDEFINED。getExtendedKeyCode方法也可用于许多国际键盘布局
“按键按下”和“按键释放”事件的级别较低,取决于平台和键盘布局。每当按下或释放某个键时,它们都会生成,并且是查找不生成字符输入的键(例如,动作键、修改键等)的唯一方法。正在按下或释放的键由getKeyCode和getExtendedKeyCode方法指示,它们返回一个虚拟键代码
一个有效的例子:
(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] ...>
这种比较是错误的,这对我不起作用。getKeyCode始终返回0,并且:key已释放,而不是:key已键入?
#<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] ...>
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)