2013-12-16 32 views
3

http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html#getKeyCode()Clojure的蹺蹺板:我如何認識對進入被按下

我不知道如何測試,如果按下的鍵是輸入。使用下面的鍋爐板和(alert ...)。我已經成功地確定事件,即是的KeyEvent,並從其documentation我看到有一個恆定的VK_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

回答

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) 
3

檢查,如果它是=的字符\newline

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

所以

... 
(fn [e] (= \newline (.getKeyChar e)) 
+0

的比較是假 – PuercoPop

+0

是的,你需要從事件getKeyChar比較 – edbond

2

試試這個:

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

編輯:(基於與評論@edbond談話)

TLDR:使用getKeyChar:key-typed事件和getKeyCode用於:key-released:key-pressed;根據您的使用情況,這三種類型的事件中的任何一種都可能是合適的。

報價KeyEventdocumentation

‘鍵入鍵’事件是較高層次,一般不依賴於平臺或鍵盤佈局。它們是在輸入Unicode字符時生成的,並且是查找字符輸入的首選方式。在最簡單的情況下,通過單鍵按壓(例如,'a')產生鍵輸入事件。然而,字符通常是通過一系列按鍵產生的(例如,'shift'+'a'),並且從按鍵事件到按鍵輸入事件的映射可以是多對一或多對多。密鑰版本通常不是生成密鑰類型事件所必需的,但有些情況下密鑰類型事件在密鑰釋放之前不會生成(例如,通過Windows中的Alt-Numpad方法輸入ASCII序列)。對於不生成Unicode字符的鍵(例如,操作鍵,修飾鍵等),不生成鍵類型事件。

getKeyChar方法總是返回一個有效的Unicode字符或CHAR_UNDEFINED。字符輸入由KEY_TYPED事件報告:KEY_PRESSED和KEY_RELEASED事件不一定與字符輸入相關聯。因此,getKeyChar方法的結果保證僅對KEY_TYPED事件有意義。

對於按鍵和鍵釋放的事件,getKeyCode方法返回事件的鍵碼。對於鍵入類型的事件,getKeyCode方法始終返回VK_UNDEFINED。getExtendedKeyCode方法也可以用於許多國際鍵盤佈局。

「按鍵」和「按鍵釋放」事件是較低級別的並且取決於平臺和鍵盤佈局。無論何時按下或釋放鍵,都會生成這些鍵,並且是唯一可以找出不生成字符輸入的鍵(例如,操作鍵,修飾鍵等)的唯一方法。被按下或釋放的鍵由getKeyCode和getExtendedKeyCode方法指示,它們返回虛擬鍵碼。

+0

這並不爲我工作。 getKeyCode總是返回0 – edbond

+1

並且使用:key-released而不是:key-typed? – omiel

+0

是的,密鑰發佈的作品完美! – edbond