2017-05-24 67 views
1

這是一個關於Java Swing的Clojure問題,所以任何一個陣營的人都可以幫助我。如何通過箭頭鍵禁用JSpinner的鍵盤控制?

我正在爲我的工作開展水文數據可視化程序,我一直在嘗試着解決這個問題。

我的應用程序基於顯示圖形降水信息。典型的使用涉及諸如在美國東南部顯示24小時的降雨量數據的任務,程序的內部狀態跟蹤結束時間和累積降雨的小時數。

主要的用戶界面由一個主要的繪圖窗格,幾個旋鈕和一個狀態欄組成(如下所示)。微調器和它們的標籤中包含的自己的JPanel,但JTextField的和包含繪圖窗格的JPanel是頂層中的contentPane

View of main interface

的鍵綁定的格式被定義爲如下所示:

"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:」微調器攔截鍵事件並且它不會觸發......相反,UP和DOWN只會導致X微調器上下移動。

如果我禁用spinners,鍵綁定工作,但是這打敗了spinners的目的。如果我禁用旋鈕,按箭頭鍵,然後重新啓用它們,那麼它可以工作,但我必須通過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來啓用/禁用spinners,只是當他們進入時,但我寧願只是阻止他們對箭頭鍵盤事件作出反應,而不是讓他們動態啓用和禁用。

任何想法,StackOverflow?我會在這一個損失。

回答

3

試圖從旋鈕上移除鍵盤並不會產生太多 - 它說沒有鍵盤鍵!

檢出Key Bindings以獲取每個Swing組件的所有綁定列表。

以下然後將禁用綁定微調:

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

這似乎是工作太棒了!我仍然與SOMETHING攔截左右擊鍵事件有關的問題,但這是指向正確的方向。謝謝! – sleepysilverdoor