Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swing Clojure';s跷跷板:如何识别已按下回车键_Swing_Clojure_Seesaw - Fatal编程技术网

Swing Clojure';s跷跷板:如何识别已按下回车键

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

我不知道如何测试按下的键是否为Enter。使用以下锅炉板和
(警报…
)。我已经设法确定了事件e是一个KeyEvent,从中我看到有一个常量
VK\u Enter
来表示Enter和三种方法getKeyChargetKeyCodegetKeyText。使用
(警报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)