Инициирование сочетаний клавиш в кадре - PullRequest
1 голос
/ 08 декабря 2011

У меня есть следующий код, предназначенный для добавления карты сочетаний клавиш в 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_WINDOW вместо JComponent/WHEN_ANCESTOR_OF_FOCUSED_COMPONENT.Я не уверен, почему это так, поскольку фокус ДОЛЖЕН выполнить требование быть предком сфокусированных компонентов (но, возможно, нет, что с моим множеством компонентов), и все равно хотел бы услышать ответ, но естьрешение для потомков.

1 Ответ

2 голосов
/ 08 декабря 2011

for ленив. Вызывается ваша init-jframe-key-bindings! функция, которая возвращает ленивую последовательность, которая, когда она будет реализована, фактически добавит комбинации клавиш Но вы никогда не реализуете это; вы выбрасываете его результаты. Вместо for, используйте doseq, если вы хотите побочные эффекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...