Closure's Seesaw: как узнать, что нажата клавиша Enter
http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html
Я не знаю, как проверить, была ли нажата клавиша Enter. Используя следующую плиту котла и (alert ...)
, Мне удалось определить, что событие, e, является KeyEvent и из его документации я вижу, что есть константа VK_Enter
представлять Enter и три метода getKeyChar, getKeyCode и getKeyText. С помощью (alert e)
Похоже, что getKeyChar возвращает Enter или, по крайней мере, что-то, представленное строкой Enter, но (= (.getKeyChar e) "Enter")
возвращает ложь Как я могу определить, что Enter был нажат?
(-> (frame :title "Zangalon" :content
(text :text "Input Goes here"
:listen [:key-typed (fn [e] ..)]))
pack!
show!)
VK_Enter
3 ответа
Рабочий пример:
(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)
Проверьте, если это =
персонажу \newline
user> (java.net.URLDecoder/decode "%00")
true
так
...
(fn [e] (= \newline (.getKeyChar e))
Попробуй это:
(fn [e]
(if (= java.awt.event.KeyEvent/VK_ENTER (.getKeyCode e))
...)
РЕДАКТИРОВАТЬ: (на основе разговора с @edbond в комментариях)
TLDR: использовать getKeyChar
за :key-typed
события и getKeyCode
за :key-released
или же :key-pressed
; в зависимости от вашего варианта использования может подойти любой из трех типов событий.
квотирование KeyEvent
Документация:
События с типом ключа являются высокоуровневыми и обычно не зависят от платформы или раскладки клавиатуры. Они генерируются при вводе символа Unicode и являются предпочтительным способом узнать о вводе символов. В простейшем случае событие, набранное клавишей, создается одним нажатием клавиши (например, "а"). Однако часто символы создаются сериями нажатий клавиш (например, "shift" + "a"), и отображение из событий нажатия клавиши в события, набранные клавишей, может быть "многие к одному" или "многие ко многим". Выпуски ключей обычно не требуются для генерации события с типом ключа, но в некоторых случаях событие с типом ключа не генерируется до тех пор, пока ключ не отпущен (например, ввод последовательностей ASCII с помощью метода Alt-Numpad в Windows). Для ключей, которые не генерируют символы Unicode (например, клавиши действий, клавиши-модификаторы и т. Д.), Не генерируются события с типом ключа.
Метод getKeyChar всегда возвращает действительный символ Unicode или CHAR_UNDEFINED. Ввод символов описывается событиями KEY_TYPED: события KEY_PRESSED и KEY_RELEASED не обязательно связаны с вводом символов. Следовательно, результат метода getKeyChar гарантированно будет значимым только для событий KEY_TYPED.
Для событий нажатия клавиши и отпускания клавиши метод getKeyCode возвращает ключ события keyCode. Для событий с типом ключа метод getKeyCode всегда возвращает VK_UNDEFINED. Метод getExtendedKeyCode также может использоваться со многими международными раскладками клавиатуры.
События "нажатие клавиши" и "отпускание клавиши" являются низкоуровневыми и зависят от платформы и раскладки клавиатуры. Они генерируются всякий раз, когда клавиша нажимается или отпускается, и являются единственным способом узнать о клавишах, которые не генерируют ввод символов (например, клавиши действий, клавиши-модификаторы и т. Д.). Нажатие или отпускание клавиши указывается методами getKeyCode и getExtendedKeyCode, которые возвращают код виртуальной клавиши.