【问题标题】:Key bindings vs. key listeners in JavaJava 中的键绑定与键监听器
【发布时间】:2013-02-23 18:19:46
【问题描述】:

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

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

【问题讨论】:

    标签: java swing keylistener key-bindings key-events


    【解决方案1】:

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

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

    key bindings 的那个页面涵盖了我倾向于使用它们而不是KeyListener 的很多原因。它列出了许多对KeyListener 根本“不可用”的东西。例如。选择:

    • WHEN_FOCUSED
    • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
    • WHEN_IN_FOCUSED_WINDOW

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

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

    文本组件

    正如@Robin 所指出的,文本组件还具有DocumentListenerDocumentFilter,可以添加更适合文本文档的功能。有关文档 listenersfilters 的更多信息,请参阅 Text Component Features

    【讨论】:

    • 如果我们想要一个参考答案,我至少会包含一个“不要将它们用于文本组件,而是使用DocumentListener,DocumentFilter”段落。 KeyListeners 上的很多 SO 问题都与文本组件有关
    • +1,只想扩展reusable chunks of code 评论。如何共享操作可能并不明显。例如,Actions 也可以用来创建 JMenuItems 和 JButtons。
    【解决方案2】:
    1. KeyBindings(高抽象)

    优点

    • 可设置,可共享,

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

    • 轻松解决窗口焦点问题(也可设置,确保在 Java 中窗口必须焦点在屏幕上)

    • Swing 内部使用 KeyBindings、内置快捷键、动作,更多在 Key Bindings by @camickr 中(在 Swing 中实现了有趣的快捷键和动作)

    • 输出应该是 Swing 动作(与 Swing 中相同的高可能抽象)

    缺点

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

    • 无法覆盖同时按下三个或更多键

    • 代码看起来非常复杂(完全不正确,与来自 KeyListener 的相同代码相比,代码在大多数情况下是排序器)

    • 删除了更多细节,以查看 @camickr 的评论(重复操作需要 Swing Timer)

    • 无法使用 API 中实现的一种方法来使用()

    .

    KeyListeners(低级监听器)


    优点

    • 非常易于使用,直观

    • 一两键事件的代码很短

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

    • 可以覆盖树或按下更多键(例如),对于非常复杂的快捷键,那么无论哪个可以触发任何单独的键事件都没有关系

    • 可以通过编程方式调用 event.consume()

    • 可以监听来自复合 JComponents(JComboBox、JSpinner ...)的 non_finalized 内部事件

    缺点

    • 部分容器和 JComponent 无法访问

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

    • 未指定用于 Swing JComponents

    .

    AWTEventListener


    • 结合所有键和鼠标事件,Java 中可能的低级监听器

    • 基本上没有理由为大多数(甚至非常复杂的)基于 Swing 的 GUI 使用此侦听器

    • 我看到此侦听器在自定义组件中实现,基于 AWT 所需对等点来自本机操作系统

    • 但是 AWTEventListener Application Inactivity and Global Event Listeners by @camickr有出色的实现@

    .

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


    【讨论】:

    • +1 很多细节。但是,您不需要用于重复操作的 Swing Timer。 KeyPressed 将被重复触发。通常建议使用 Timer,以便您可以控制重复间隔。同样的逻辑也适用于 KeyEvents。
    • @Don Hatch hmmm 请问no access to the x,y location,我的观点--->为了更好的帮助,尽快发布基于SSCCE的自己的问题,简短,可运行,可编译,AFAIK有3个或更多keyPressed的限制在同一时间(键捷径)或实际排序的 keyPressed/released 键捷径,休息更好,更舒适,更易于使用 KeyBindings 而不是 KeyListener
    • @mKorbel,我之前添加了一条评论,但这是一个错误,所以我删除了它。我把自己弄糊涂了,以为 keyEvents 有 getX(),getY(),但他们没有。没关系!
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2016-06-10
    • 1970-01-01
    相关资源
    最近更新 更多