2017-05-24 7 views
1

이것은 Java Swing에 관한 Clojure 질문이므로 두 캠프의 사람들이 나를 도울 수 있습니다.화살표 키를 사용하여 JSpinner의 키보드 제어를 비활성화하는 방법은 무엇입니까?

나는 내 일에 대한 수문 데이터 시각화 프로그램을 연구하고 있으며, 나는 이것을 알아 내려고 노력하고있다.

내 응용 프로그램은 그래픽 강수 정보를 표시하는 것을 기반으로합니다. 일반적인 사용은 미국 남동부 지역에 24 시간 동안 강우량 데이터를 표시하는 것과 같은 작업을 포함하며, 프로그램의 내부 상태는 강우량을 축적 할 시간과 종료 시간을 추적합니다.

메인 사용자 인터페이스는 기본 그리기 창, 두 개의 스피너 및 상태 표시 줄 (아래 참조)로 구성됩니다. 스피과 라벨은 자신의 JPanel에 포함되어 있지만, 아래와 같이 JTextField를하고 드로잉 창을 포함하는 JPanel의는 View of main interface

키 바인딩

이 형식에 정의 된 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? 이걸 잃어 버렸어.

답변

3

스피너에서 키 바인딩을 제거하려고해도 키 바인딩이 없다고 말합니다.

각 Swing 구성 요소에 대한 모든 바인딩 목록을 보려면 체크 아웃 Key Bindings. 다음 회에 대한 바인딩을 사용할 수 없게됩니다

다음은 :

InputMap im = spinner.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
im.put(KeyStroke.getKeyStroke("DOWN"), "none"); 
im.put(KeyStroke.getKeyStroke("UP"), "none"); 
+0

이 잘 작동하는 것 같다! 나는 여전히 좌/우 키 스트로크 이벤트를 가로 채는 것에 문제가있다. 그러나 이것은 올바른 방향으로 나를 가리키고있다. 고맙습니다! – sleepysilverdoor