Java 在帧上启动键绑定

Java 在帧上启动键绑定,java,swing,clojure,Java,Swing,Clojure,我有以下代码,用于将键绑定映射添加到JFrame。不幸的是,虽然它可以编译,而且我在运行程序时没有遇到错误,但是绑定不起作用 我错过了什么 (defn create-action

我有以下代码,用于将键绑定映射添加到JFrame。不幸的是,虽然它可以编译,而且我在运行程序时没有遇到错误,但是绑定不起作用

我错过了什么

(defn create-action                                                                                                                                                                                                                           
  "Returns an Action that, when called, executes the given fn."                                                                                                                                                                               
  [f]                                                                                                                                                                                                                                         
  (proxy [AbstractAction] []                                                                                                                                                                                                                  
    (actionPerformed [e] (f))))                                                                                                                                                                                                               

(defn init-jframe-key-bindings!                                                                                                                                                                                                               
  "Adds the keybindings to the frame.                                                                                                                                                                                                         

   keymap take the form of:                                                                                                                                                                                                                   
   {\"KEYSTROKE\" [:key-name fn]                                                                                                                                                                                                              
    ...}"                                                                                                                                                                                                                                     
  [frame keymap]                                                                                                                                                                                                                              
  (let [actionmap (.getActionMap (.getRootPane frame))                                                                                                                                                                                        
        inputmap (.getInputMap (.getRootPane frame) JComponent/WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)]                                                                                                                                           
    (doseq [[keystroke [keyword action]] keymap]                                                                                                                                                                                                
      (.put actionmap (name keyword) (create-action action))                                                                                                                                                                              
      (.put inputmap (KeyStroke/getKeyStroke keystroke) (name keyword)))))
绑定是这样添加的:

  (doto frame 
    (.setFocusable true)
    (init-jframe-key-bindings!                                                                                                                                                                                                              
      {"RIGHT" [:next-view to-next-view]                                                                                                                                                                                                     
       "LEFT" [:prev-view to-previous-view]                                                                                                                                                                                                  
       "T" [:thresh-test conduct-thresh-test]                                                                                                                                                                                                
       "A" [:add-marks #(dosync (ref-set ref-mark-mode :a))]                                                                                                                                                                                 
       "D" [:del-marks #(dosync (ref-set ref-mark-mode :d))]})) 

编辑解决方案是使用
JComponent/WHEN_IN_FOCUSED_窗口
代替
JComponent/WHEN_FOCUSED_组件
。我不知道为什么会这样,因为focus应该满足成为专注组件的祖先的要求(但也许不是,因为我有无数的组件),并且仍然希望听到答案,但对于后代来说,有一个解决方案

for
是懒惰的。您的
initjframe键绑定函数,它返回一个惰性序列,当实现该序列时,实际上会添加键绑定。但你从未实现它;你扔掉它的结果。如果你想得到副作用,请使用
doseq
,而不是

这是一个可怕的错误,是的,但我确实抓住了这个问题(并且完全忽略了更新我的问题,这让我很懊恼),不幸的是,它并没有解决我的问题。