Java中的密钥绑定与密钥侦听器

Java中的密钥绑定与密钥侦听器,java,swing,keylistener,key-bindings,key-events,Java,Swing,Keylistener,Key Bindings,Key Events,我注意到,在Java/Swing中,似乎至少有两种不同的方法来处理关键事件: 每种方法的优点/缺点是什么?什么时候你应该选择其中一种而不是另一种 你什么时候应该选择一个而不是另一个 更喜欢键绑定,因为它们是引入的。KeyListener是与事件的低级连接 该页面涵盖了很多我倾向于使用它们而不是keylister的原因。它列出了许多对KeyListener来说根本“不可用”的内容。例如,选择: 聚焦时 在聚焦窗口中时 我读的链接文件越多,我就越不理解问这个问题的必要性。例如: 键绑定

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

每种方法的优点/缺点是什么?什么时候你应该选择其中一种而不是另一种

你什么时候应该选择一个而不是另一个

更喜欢键绑定,因为它们是引入的。
KeyListener
是与事件的低级连接

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

  • 聚焦时
  • 在聚焦窗口中时
我读的链接文件越多,我就越不理解问这个问题的必要性。例如:

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

文本组件 正如@Robin所指出的,文本组件还具有&可以添加这些组件以实现更适合文本文档的功能。有关文档的详细信息,请参阅

  • 键绑定(高抽象)

  • 优势

    • 可设置、可共享、

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

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

    • 在内部Swing使用键绑定、内置快捷方式、操作等(在Swing中实现有趣的快捷方式和操作)

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

    缺点

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

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

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

    • 有关更多详细信息,请参见@camickr的命令(重复操作所需的摆动计时器)

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

    键侦听器(低级侦听器)


    优势

    • 非常容易使用,直观

    • 代码对于一两个关键事件来说非常简短

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

    • 可以覆盖树或按下多个键(例如),对于非常复杂的按键短切,则无论哪一个键可以触发任何单独的按键事件

    • 可以通过编程方式访问event.consume()

    • 可以侦听来自复合JComponents(JComboBox、JSpinner…)的未完成的内部事件

    缺点

    • 不适用于部分容器和组件

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

    • 未指定用于Swing组件

    AWTEventListener


    • 要组合所有按键和鼠标事件,请在Java中尽可能使用低级侦听器

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

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

    • 但是AWTEventListener有一些优秀的实现

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



    如果我们想要一个参考答案,我至少会包括一段“不要将它们用于文本组件,而是使用
    DocumentListener
    DocumentFilter
    ”的内容。关于
    keylister
    s的许多问题都与文本组件+1有关,只想扩展一下
    可重用的代码块
    注释。如何分享行动可能并不明显。例如,操作还可以用于创建JMenuItems和jbutton。+1大量细节。但是,重复操作不需要Swing计时器。按键将被反复触发。通常建议使用计时器,以便控制重复间隔。同样的逻辑也适用于KeyEvents。@Don Hatch hmmm请说明
    无法访问x,y位置
    ,我的观点--->为了获得更好的帮助,请尽快发布自己的问题,基于SSCE,简短,可运行,可编译,AFAIK,同时按下3个或更多键有限制(快捷键)或者按键按下/释放的实际顺序为快捷键,对于其他键更好、更舒适、更易于管理,可以使用按键绑定KeyListener@mKorbel,我之前添加了一条评论,但这是一个错误,所以我删除了它。我把自己弄糊涂了,以为keyEvents有getX(),getY(),但它们没有。不要介意!