這是一個關於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:」微調器攔截鍵事件並且它不會觸發......相反,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?我會在這一個損失。
這似乎是工作太棒了!我仍然與SOMETHING攔截左右擊鍵事件有關的問題,但這是指向正確的方向。謝謝! – sleepysilverdoor