Java中的键绑定与键侦听器

mik*_*era 10 java swing key-events keylistener key-bindings

我注意到在Java/Swing中,似乎至少有两种不同的方法来处理关键事件:

每个人的优点/缺点是什么,何时你更喜欢一个而不是另一个?

And*_*son 21

什么时候你应该更喜欢一个而不是另一个?

因为它们被引入所以更喜欢Key Bindings.A KeyListener是与事件的较低级别连接.

关键绑定的页面涵盖了我倾向于使用它们而不是使用它们的很多原因KeyListener.它列出了许多简单地"不可用"的东西KeyListener.EG选择:

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

我阅读链接文档越多,我就越不能理解提出问题的必要性.例如:

键绑定的替代方法是使用键侦听器.键侦听器可以作为键盘输入的低级接口,但是对于单个键的响应,键绑定更合适,并且更容易维护代码.如果在组件没有焦点时要激活键绑定,则键侦听器也很困难.密钥绑定的一些优点是它们有点自我记录,考虑包含层次结构,鼓励可重用的代码块(Action对象),并允许轻松删除,自定义或共享操作.此外,它们可以轻松更改操作绑定的键.另一个优点Actions是它们具有启用状态,该状态提供了一种简单的方法来禁用操作,而无需跟踪它所连接的组件.

文字组件

正如@Robin所指出的,文本组件也具有DocumentListener&DocumentFilter可以添加到更适合文本文档的功能.有关文档侦听过滤器的更多信息,请参阅文本组件功能.

  • 如果我们想要一个参考答案,我至少会包含一个"不要将它们用于文本组件,而是使用`DocumentListener`,`DocumentFilter`"段落.关于`KeyListener'的许多SO问题都与文本组件有关 (2认同)
  • +1,只是想扩展“可重用的代码块”注释。如何共享操作可能并不明显。例如,Actions 也可用于创建 JMenuItems 和 JButtons。 (2认同)

mKo*_*bel 12

  1. KeyBindings(高抽象)

好处

  • 可设定,可分享,

  • 指定为简单的快捷方式,没有不必要的副作用(大多数事件非常简单和可设置)

  • 用窗口中的焦点来解决任何问题(也可以设置,在Java中肯定窗口必须关注屏幕)

  • 在内部进行Swing以使用KeyBindings,built_in快捷方式,操作,更多在@camickr的键绑定中(在Swing中实现有趣的快捷方式和操作)

  • 输出应该是Swing Action(Swing中同样高的抽象)

缺点

  • 无法覆盖键盘上的所有键

  • 不可能同时按下三个或更多键

  • 代码看起来非常复杂(根本不是真的,代码在大多数情况下是与KeyListener中的相同代码进行比较的分类器)

  • 删除更多详细信息以查看@camickr(需要Swing Timer重复操作)

  • 不可能使用API​​中实现的一个方法来使用()

.

KeyListeners(低级侦听器)


好处

  • 非常容易使用,直观

  • 对于一个两个关键事件,代码非常短

  • 不需要任何关于Swing,Java的知识

  • 可以覆盖树或按下更多的键(例如),对于非常复杂的按键切换,那么哪个可以触发任何单独的键事件无关紧要

  • 有可能以编程方式发送到event.consume()

  • 可以从Compound JComponents(JComboBox,JSpinner ...)中侦听非最终的内部事件

缺点

  • 部分容器和JComponents无法访问

  • (J)组件应该是焦点所有者,并且必须是可聚焦的

  • 未指定用于Swing JComponents

.

AWTEventListener所


.

注意:Key事件的排序是平台不同的平台