이것은 Java Swing에 관한 Clojure 질문이므로 두 캠프의 사람들이 나를 도울 수 있습니다.화살표 키를 사용하여 JSpinner의 키보드 제어를 비활성화하는 방법은 무엇입니까?
나는 내 일에 대한 수문 데이터 시각화 프로그램을 연구하고 있으며, 나는 이것을 알아 내려고 노력하고있다.
내 응용 프로그램은 그래픽 강수 정보를 표시하는 것을 기반으로합니다. 일반적인 사용은 미국 남동부 지역에 24 시간 동안 강우량 데이터를 표시하는 것과 같은 작업을 포함하며, 프로그램의 내부 상태는 강우량을 축적 할 시간과 종료 시간을 추적합니다.
메인 사용자 인터페이스는 기본 그리기 창, 두 개의 스피너 및 상태 표시 줄 (아래 참조)로 구성됩니다. 스피과 라벨은 자신의 JPanel에 포함되어 있지만, 아래와 같이 JTextField를하고 드로잉 창을 포함하는 JPanel의는
키 바인딩
이 형식에 정의 된 contentPane에 최고 수준입니다
다음과 같이"control S" {:type :function
:config :configure-shapefiles}
"control Z" {:type :function
:config :configure-zooms}
"NUMPAD0" {:type :function
:config :toggle-grids-on}
"VK_DOWN" {:type :function
:config :prev-day}
"VK_UP" {:type :function
:config :next-day}
"VK_RIGHT" {:type :function
:config :next-hour}
"VK_LEFT" {:type :function
:config :prev-hour}}
이 구성 맵은 JFrame의의 콘텐츠 창에 대한 키 바인딩로 변환된다 :
(defn- set-keystroke-shortcuts
[]
(let [inputmap (.getInputMap (.getContentPane frame) JComponent/WHEN_IN_FOCUSED_WINDOW)
actionmap (.getActionMap (.getContentPane frame))
config (merge (read-clj "config/keybindings/site.clj")
(if (.exists (File. "config/keybindings/user.clj"))
(if-let [my-config ((read-clj "config/keybindings/user.clj") me)]
my-config {})))]
(doseq [[k {shortcut-type :type shortcut-info :config}] config
:let [sym-name (str (gensym))
fun (case shortcut-type
:plot #(process-display-config shortcut-info)
:function (dealias-keystroke-config-keyword shortcut-info)
#{})]]
(.put inputmap (KeyStroke/getKeyStroke k) sym-name)
(.put actionmap sym-name (action fun)))))
공간 절약을 위해 나는 dealias-keystroke-config-keyword와 process-display-config에 대한 코드를 포함하지 않았습니다. 나는 : 다음날, : 전날, : 다음 시간, 그리고 : : 앞 시간 키워드가 분석의 종료 시간을 각각 24, -24, 1 및 -1 시간으로 이동 시킨다는 것을 분명히 할 것이다.
내가 겪고있는 문제는 이러한 명령을 화살표 키에 바인딩하려는 시도가 작동하지 않는다는 것입니다. 다른 화살표 키가 아닌 다른 키에 바인딩 할 때마다 모든 것이 계획대로 작동합니다. 그러나 화살표 키에 묶으려고하면 "X :"회 전자가 키 이벤트를 가로 채고 발사되지 않습니다 ... 대신 위 아래로 X 회 전자가 위아래로 움직입니다.
스피너를 사용하지 않으면 키 바인딩이 작동하지만 스피너의 목적에 위배됩니다. 스피너를 비활성화하고 화살표 키를 누른 다음 다시 활성화하면 작동하지만 REPL을 통해 수동으로 비활성화해야합니다. 그런 다음 응용 프로그램 창으로 돌아가서 화살표 키를 누른 다음 다시 활성화하십시오. 내 REPL. 해결책이 아닙니다.
스피너에서 키 바인딩을 제거하려고해도 키 바인딩이 없다고합니다. 스피의 자녀를 통과
(.allKeys (.getInputMap x-panes-spinner)) => nil
는이 점에서 하나 도움이되지 않습니다 :
(doseq [comp (.getComponents x-panes-spinner)
k (.allKeys (.getInputMap comp))]
(prn [(.getName comp) (.getKeyCode k)]))
=> ["Spinner.nextButton" 32]
=> ["Spinner.nextButton" 32]
=> ["Spinner.nextButton" 10]
=> ["Spinner.nextButton" 10]
=> ["Spinner.previousButton" 32]
=> ["Spinner.previousButton" 32]
=> ["Spinner.previousButton" 10]
=> ["Spinner.previousButton" 10]
(32) 및 (10)가 스페이스 바를에 해당하고 키를 입력, 즉 나에게 도움이되지 않도록.
입력 할 때만 스피너를 활성화/비활성화 할 수있는 MouseListener를 추가 할 수 있다고 확신하지만, 동적으로 활성화 및 비활성화하지 말고 화살표 패드 이벤트에 반응하지 못하도록 막습니다. .
어떤 아이디어, StackOverflow? 이걸 잃어 버렸어.
이 잘 작동하는 것 같다! 나는 여전히 좌/우 키 스트로크 이벤트를 가로 채는 것에 문제가있다. 그러나 이것은 올바른 방향으로 나를 가리키고있다. 고맙습니다! – sleepysilverdoor