3

http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html#getKeyCode()

我不知道如何测试按下的键是否为 Enter。使用以下样板和(alert ...). 我已经设法确定事件 e 是一个 KeyEvent 并且从它的文档中我看到有一个常量VK_Enter来表示 Enter 和三个方法getKeyChargetKeyCodegetKeyText。使用(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

4

3 回答 3

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)
于 2013-12-17T05:23:17.140 回答
3

检查是否=与角色有关\newline

user> (java.net.URLDecoder/decode "%00")
true

所以

...
(fn [e] (= \newline (.getKeyChar e))
于 2013-12-17T00:17:56.913 回答
2

尝试这个:

(fn [e]
  (if (= java.awt.event.KeyEvent/VK_ENTER (.getKeyCode e))
    ...)

编辑:( 基于在评论中与@edbond 的对话)

TLDR:用于事件和getKeyChar用于或;根据您的用例,这三种类型的事件中的任何一种都可能适用。:key-typedgetKeyCode:key-released:key-pressed

引用KeyEvent文档

“按键类型”事件是更高级别的,通常不依赖于平台或键盘布局。它们是在输入 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 方法指示,它们返回一个虚拟键码。

于 2013-12-17T05:07:39.303 回答