如何通过箭头键禁用 JSpinner 的键盘控制?
How does one disable keyboard control of a JSpinner via the arrow keys?
这是一个关于 Java Swing 的 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)))))
为了节省 space,我没有包含 dealias-keystroke-config-keyword 和 process-display-config 的代码。我将澄清 :next-day、:prev-day、:next-hour 和 :prev-hour 关键字导致分析的结束时间分别偏移 24、-24、1 和 -1 小时。
我 运行 遇到的问题是,我尝试将这些命令绑定到箭头键时不起作用。每当我将它们绑定到其他非箭头键时,一切都会按计划进行。但是当我尝试将它们绑定到箭头键时,"X:" 微调器会拦截按键事件并且不会触发......相反,UP 和 DOWN 只会导致 X 微调器上下移动。
如果我禁用微调器,键绑定会起作用,但这会破坏微调器的目的。如果我禁用微调器,点击箭头键,然后重新启用它们,那么它就可以工作,但我必须通过 REPL 手动禁用它们,然后返回到应用程序 window,点击箭头键,然后在我的 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 对应 space 栏和输入键,所以这对我没有帮助。
我非常有信心我可以仅在输入微调器时将 MouseListener 添加到 enable/disable 微调器,但我宁愿阻止它们对箭头板事件做出反应,而不是让它们动态变化启用和禁用。
有什么想法吗,Whosebug?我对此一筹莫展。
Trying to remove the keybindings from the spinners doesn't yield much -- it says there are no keybindings!
查看 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");
这是一个关于 Java Swing 的 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)))))
为了节省 space,我没有包含 dealias-keystroke-config-keyword 和 process-display-config 的代码。我将澄清 :next-day、:prev-day、:next-hour 和 :prev-hour 关键字导致分析的结束时间分别偏移 24、-24、1 和 -1 小时。
我 运行 遇到的问题是,我尝试将这些命令绑定到箭头键时不起作用。每当我将它们绑定到其他非箭头键时,一切都会按计划进行。但是当我尝试将它们绑定到箭头键时,"X:" 微调器会拦截按键事件并且不会触发......相反,UP 和 DOWN 只会导致 X 微调器上下移动。
如果我禁用微调器,键绑定会起作用,但这会破坏微调器的目的。如果我禁用微调器,点击箭头键,然后重新启用它们,那么它就可以工作,但我必须通过 REPL 手动禁用它们,然后返回到应用程序 window,点击箭头键,然后在我的 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 对应 space 栏和输入键,所以这对我没有帮助。
我非常有信心我可以仅在输入微调器时将 MouseListener 添加到 enable/disable 微调器,但我宁愿阻止它们对箭头板事件做出反应,而不是让它们动态变化启用和禁用。
有什么想法吗,Whosebug?我对此一筹莫展。
Trying to remove the keybindings from the spinners doesn't yield much -- it says there are no keybindings!
查看 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");