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, которые возвращают код виртуальной клавиши.

Другие вопросы по тегам