Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过箭头键禁用JSpinner的键盘控制?_Java_Swing_Input_Clojure_Key Bindings - Fatal编程技术网

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

Java 如何通过箭头键禁用JSpinner的键盘控制?,java,swing,input,clojure,key-bindings,Java,Swing,Input,Clojure,Key Bindings,这是一个关于JavaSwing的Clojure问题,所以来自任何一个阵营的人都可以帮助我 我正在为我的工作做一个水文数据可视化程序,我花了最宝贵的时间试图弄明白这一点 我的应用程序基于显示图形化降水信息。典型的应用包括显示美国东南部24小时的降雨数据,程序的内部状态跟踪结束时间和累积降雨的小时数 主用户界面包括一个主绘图窗格、两个微调器和一个状态栏(如下所示)。微调器及其标签包含在它们自己的JPanel中,但包含绘图窗格的JTextField和JPanel在contentPane中是顶级的 键

这是一个关于JavaSwing的Clojure问题,所以来自任何一个阵营的人都可以帮助我

我正在为我的工作做一个水文数据可视化程序,我花了最宝贵的时间试图弄明白这一点

我的应用程序基于显示图形化降水信息。典型的应用包括显示美国东南部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击键配置关键字和进程显示配置的代码。我将澄清:next day、:prev day、:next hour和:prev hour关键字会导致分析的结束时间分别移动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对应于空格键和enter键,所以这对我没有帮助

我很有信心我可以添加一个MouseListener,仅在输入微调器时启用/禁用微调器,但我更愿意阻止它们对箭头键事件做出反应,而不是让它们动态启用和禁用

有什么想法吗,斯塔克?在这件事上我会不知所措的

尝试从微调器中删除键绑定不会产生太多效果——它说没有键绑定

(.allKeys (.getInputMap x-panes-spinner)) => nil
查看每个Swing组件的所有绑定的列表

然后,以下操作将禁用微调器的绑定:

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

这似乎很有效!我仍然在拦截左右击键事件时遇到问题,但这为我指明了正确的方向。非常感谢。