10

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

每种的优点/缺点是什么,什么时候你应该更喜欢一个而不是另一个?

4

2 回答 2

22

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

首选键绑定,因为它们被引入。AKeyListener是与事件的较低级别的连接。

键绑定的那个页面涵盖了我倾向于使用它们而不是KeyListener. 它列出了许多对KeyListener. EG 选择:

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

我阅读链接文档的次数越多,我就越无法理解提出问题的必要性。例如:

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

文本组件

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

于 2013-03-08T08:54:13.583 回答
12
  1. KeyBindings(高抽象)

好处

  • 可设置的,可共享的,

  • 指定用于简单快捷方式,没有不需要的副作用(这些事件中的大多数都非常简单且可设置)

  • 舒适地解决窗口中焦点的任何问题(也可以设置,确保在 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事件监听器


.

注意:关键事件的顺序因平台而异


于 2013-03-08T09:40:37.933 回答