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