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指出的那样,文本组件还具有DocumentListenerDocumentFilter ,可以添加更适合文本文档的function。 有关文档侦听 器和filter的更多信息,请参阅文本组件function 。

  1. 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是按平台不同的平台