如何通过箭头键禁用JSpinner的键盘控制?

时间:2017-05-24 12:30:28

标签: java swing input clojure key-bindings

这是关于Java Swing的Clojure问题,因此来自任何一个阵营的人都可以帮助我。

我正在为我的工作制定一个水文数据可视化程序,而且我一直在努力想要解决这个问题。

我的应用程序基于显示图形降水信息。典型的使用包括显示在美国东南部绘制的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的代码。我将澄清:next-day,:prev-day,:next-hour和:prev-hour关键字导致分析的结束时间分别为24小时,-24小时,1小时和-1小时。

我遇到的问题是我尝试将这些命令绑定到箭头键不起作用。每当我将它们绑定到其他非箭头键时,一切都按计划运行。但是当我尝试将它们绑定到箭头键时,“X:”微调器拦截键事件并且它不会触发......相反,UP和DOWN只会导致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?我不知道这个。

1 个答案:

答案 0 :(得分: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");