【问题标题】:Clojure's Seesaw: How do I recognize that enter has been pressedClojure 的跷跷板:我如何识别输入已按下
【发布时间】:2013-12-16 22:26:42
【问题描述】:

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

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

【问题讨论】:

    标签: swing clojure seesaw


    【解决方案1】:

    一个工作示例:

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

    【讨论】:

      【解决方案2】:

      检查字符\newline是否为=

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

      所以

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

      【讨论】:

      • 比较是假的
      【解决方案3】:

      试试这个:

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

      编辑: (基于在 cmets 中与 @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 方法返回事件的 keyCode。对于键类型事件,getKeyCode 方法总是返回 VK_UNDEFINED。 getExtendedKeyCode 方法也可用于许多国际键盘布局。

      “按键”和“按键释放”事件是较低级别的,取决于平台和键盘布局。它们是在按下或释放键时生成的,并且是找出不生成字符输入的键(例如,操作键、修饰键等)的唯一方法。按下或释放的键由 getKeyCode 和 getExtendedKeyCode 方法指示,它们返回一个虚拟键码。

      【讨论】:

      • 这对我不起作用。 getKeyCode 总是返回 0
      • 并且使用 :key-released 而不是 :key-typed ?
      猜你喜欢
      • 2016-05-31
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多