Clojure的跷跷板:我如何识别输入被按下了

时间:2013-12-16 22:26:43

标签: swing clojure seesaw

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

3 个答案:

答案 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-typedgetKeyCode: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方法指示,这些方法返回虚拟键代码。