Java中的键绑定与键侦听器

时间:2013-03-08 08:52:10

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

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

每个人的优点/缺点是什么?你何时应该选择一个而不是另一个?

2 个答案:

答案 0 :(得分:21)

  

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

首选引入键绑定。 KeyListener是与事件的较低级别连接。

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

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

我阅读链接文档越多,我就越不能理解提问的必要性。 E.G:

  

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

文本组件

如@Robin所述,文本组件也有DocumentListener& DocumentFilter可以添加更适合文本文档的功能。有关文档Text Component Features&amp ;;的详细信息,请参阅listenersfilters

答案 1 :(得分:12)

  1. KeyBindings(高抽象)

  2. 优点

    • 可设置,可共享,

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

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

    • 在内部进行Swing以使用KeyBindings,built_in快捷方式,操作,Key Bindings by @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和Mouse事件,Java中可能的低级侦听器

    • 基本上没有理由在大多数(甚至是非常复杂的)基于Swing的GUI中使用这个监听器

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

    • 但AWTEventListener有Application Inactivity and Global Event Listeners by @camickr

    • 的优秀实施方案

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