Java中的键绑定与键监听器
我注意到在Java / Swing中,处理关键事件似乎至less有两种不同的方式:
- 键绑定
- 主要听众
每个人的优点和缺点是什么,你应该什么时候select一个而不是另一个呢?
你应该什么时候更喜欢一个而不是另一个?
自推出以来,首选键绑定。 KeyListener
是事件的低级别连接。
该键绑定的页面涵盖了我倾向于使用它们而不是KeyListener
的很多原因。 它列出了很多KeyListener
“不可用”的东西。 EGselect:
-
WHEN_FOCUSED
-
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
-
WHEN_IN_FOCUSED_WINDOW
我阅读链接文档的次数越多,我越能理解提问的必要性。 例如:
键绑定的替代方法是使用键监听器。 关键监听器有其作为键盘input的低级接口的位置,但是对于单个键的响应,键绑定更合适,并且倾向于导致更容易维护的代码。 如果键绑定在组件没有焦点时处于活动状态,则键监听器也很困难。 键绑定的一些优点是它们有点自我logging,考虑包含层次结构,鼓励可重用的代码块(
Action
对象),并允许轻松移除,定制或共享操作。 而且,他们可以很容易地改变一个动作绑定的关键。Actions
另一个优点是它们有一个启用状态,它提供了一个简单的方法来禁用动作,而不必追踪它所连接的组件。
文本组件
正如@Robin指出的那样,文本组件还具有DocumentListener
和DocumentFilter
,可以添加更适合文本文档的function。 有关文档侦听 器和filter的更多信息,请参阅文本组件function 。
- KeyBindings(高抽象)
优点
-
可设置,可共享,
-
指定为简单的快捷方式,没有不必要的副作用(大多数这些事件是相当简单和可设置的)
-
在窗口焦点集中解决任何问题(可以设置,在Java中确定窗口必须专注于屏幕)
-
Swing内部使用KeyBindings,built_in快捷方式,动作,更多的关键绑定@camickr (在Swing中实现有趣的快捷方式和操作)
-
输出应该是Swing Action(Swing中的相同高度可能的抽象)
缺点
-
无法覆盖键盘上的所有键
-
不可能在同一时间按下三个或更多按键
-
代码看起来像非常复杂(根本不是真的,在大多数情况下,代码与来自KeyListener的代码相比是相同的)
-
删除更多的细节,看到通过@camickr (重复行动所需的摆动计时器)
-
不可能在API中使用一个方法来使用()
。
KeyListeners(低级侦听器)
优点
-
非常好用,直观
-
代码是非常短的两个关键事件
-
不需要关于Swing,Java的任何知识
-
是可以覆盖树或更多的键被按下(例如),非常复杂的keyshortcuts,那么没有关系,哪一个可以触发任何单独的关键事件
-
是可以编程方式event.consume()
-
可以从Compound JComponents(JComboBox,JSpinner …)中监听非最终化的内部事件
缺点
-
部分容器和JComponent不可访问
-
(J)组件应该是焦点所有者,并且必须是可以关注的
-
不是为Swing JComponents指定的
。
AWTEventListener所
-
在Java中尽可能地将所有Key和Mouse事件,低级侦听器结合起来
-
基本上没有理由在基于Swing的大部分(甚至是非常复杂的)GUI上使用这个监听器
-
我发现这个监听器是在基于AWT的自定义组件中实现的,所需的对等组件来自本机操作系统
-
但是@camickr有AWTEventListener Application Inactivity和Global Event Listeners的优秀实现
。
注意:按键事件的sorting是按平台不同的平台