我注意到在 Java / Swing 中似乎至少有两种不同的方式来处理关键事件:
每种的优点/缺点是什么,什么时候你应该更喜欢一个而不是另一个?
什么时候你应该更喜欢一个而不是另一个?
首选键绑定,因为它们被引入。AKeyListener
是与事件的较低级别的连接。
键绑定的那个页面涵盖了我倾向于使用它们而不是KeyListener
. 它列出了许多对KeyListener
. EG 选择:
WHEN_FOCUSED
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
WHEN_IN_FOCUSED_WINDOW
我阅读链接文档的次数越多,我就越无法理解提出问题的必要性。例如:
键绑定的替代方法是使用键侦听器。按键侦听器作为键盘输入的低级接口有它们的位置,但对于响应单个按键,按键绑定更合适,并且往往会导致更容易维护的代码。如果要在组件没有焦点时激活键绑定,则键侦听器也很困难。键绑定的一些优点是它们有点自我记录,考虑到包含层次结构,鼓励可重用的代码块(
Action
对象),并允许轻松删除、自定义或共享操作。此外,它们使更改绑定到动作的键变得容易。另一个优点Actions
是它们具有启用状态,它提供了一种简单的方法来禁用操作,而无需跟踪它附加到哪个组件。
正如@Robin 所指出的,文本组件也有DocumentListener
&DocumentFilter
可以添加更适合文本文档的功能。有关文档侦听器和过滤器的更多信息,请参阅文本组件功能。
好处
可设置的,可共享的,
指定用于简单快捷方式,没有不需要的副作用(这些事件中的大多数都非常简单且可设置)
舒适地解决窗口中焦点的任何问题(也可以设置,确保在 Java 中窗口必须在屏幕上具有焦点)
Swing 在内部使用 KeyBindings,内置快捷方式,动作,更多在@camickr 的 Key Bindings 中(在 Swing 中实现了有趣的快捷方式和动作)
输出应该是 Swing 动作(与 Swing 中相同的高可能抽象)
缺点
无法覆盖键盘上的所有键
无法覆盖同时按下三个或更多键
代码看起来非常复杂(根本不正确,与 KeyListener 中的相同代码相比,代码在大多数情况下是排序器)
删除以查看更多详细信息以查看@camickr 的评论(重复操作需要 Swing Timer)
无法使用 API 中实现的一种方法来使用()
.
KeyListeners(低级监听器)
好处
非常易于使用,直观
一两个关键事件的代码很短
不需要任何关于 Swing、Java 的知识
可以覆盖树或按下更多键(例如),对于非常复杂的快捷键,那么哪个可以触发任何单独的键事件都没有关系
可以以编程方式对 event.consume()
可以从 Compound JComponents (JComboBox, JSpinner ...) 中侦听 non_finalized 内部事件
缺点
部分容器和 JComponents 无法访问
(J)组件应该是焦点所有者并且必须是可聚焦的
未指定用于 Swing JComponents
.
AWT事件监听器
结合所有键和鼠标事件,Java 中可能的低级监听器
基本上没有理由在大多数(甚至非常复杂的)基于 Swing 的 GUI 中使用这个监听器
我看到这个监听器在基于 AWT 的自定义组件中实现,所需的对等点来自本机操作系统
但是@camickr 对 AWTEventListener Application Inactivity 和 Global Event Listeners 有很好的实现
.
注意:关键事件的顺序因平台而异