gpt4 book ai didi

java - Keymap、InputMap、ActionMap、KeyListener — 选择重载

转载 作者:行者123 更新时间:2023-11-29 02:58:36 24 4
gpt4 key购买 nike

我找不到关于所有这些之间关系的简明答案,所以我可以选择最佳实践并继续前进。 JTextComponent有:

  • 旧的 addKeyListener(..)。我们编写一个 KeyListener,其中包含在 keyPressed(..)keyTyped(..) 等事件上调用的方法,我们可以查询:event.getKeyCode()

  • addKeymap(..)setKeymap(..)KeymapaddActionForKeyStroke(..),它需要一个 KeyStroke(我们可以通过调用 KeyStroke' s 指定字符或键代码的静态方法)和一个 Action,它是一个带有铃声和口哨声的 ActionListener

  • getInputMap(..)getActionMap(..)InputMapKeyStroke(如上)映射到 StringActionMap 将字符串映射到 Action(如上)。 Java 教程 How to use key bindings谈论那个。

这是实现相同功能的三种冗余方式。除了比较优势/劣势之外,这还自然地提出了这三种机制如何共存的问题?哪些优先于其他?

最佳答案

  • InputMap + ActionMap 系统在 1.3 中引入并替换了旧的 Keymap(使用 InputMap 重新实现) + ActionMap 引擎盖下的系统,用于向后兼容)。新系统具有 Keymap 功能的超集。 (来自 Loy 和 Eckstein 的 O'Reilly 书 Java Swing,在 page 755 上。)

  • 因此,我们无需担心新代码的Keymap

  • How to use key bindings 中的 Java 教程甚至没有提到 Keymap,但它确实解决了 KeyListener 与键 bindings(即 InputMap + ActionMap 设施):

    • KeyListener 的方法需要更多的工作,因为焦点和组件包含层次结构(它不知道)的问题。比如我们有一个table组件,里面包含一个table-cell组件,它有焦点,按键会向table cell组件发送事件,由我们来决定将它们转发到表格(因为我们想要更改表格当前选定的单元格)。

    • 相比之下,键绑定(bind)让我们可以直接在父组件上指定绑定(bind):每个 JComponent 都有三个 InputMap 和一个 ActionMap。输入映射属于以下类型:JComponent.WHEN_FOCUSEDWHEN_ANCESTOR_OF_FOCUSED_COMPONENTWHEN_IN_FOCUSED_WINDOW。与监听器不同,在监听器中,焦点组件上的所有 KeyListener 按顺序处理,使用键绑定(bind)事件将向上传播层次结构(好吧,我的树想想,因为每个组件只有一个父级)直到它找到一个 Action (还没有被禁用),这就是它停止的时候。在此搜索过程中,第二种类型的 InputMap 优先于第三种类型。

    • KeyListener 优先于键绑定(bind)机制。当一个组件的 KeyListener 正在处理时,其中一个可能 e.consume(),然后事件将不会进一步到达 KeyListeners,也不是键绑定(bind)层次结构。最后添加的关键监听器首先被处理。

  • 因此,虽然键绑定(bind)方法从头开始设置起来有点麻烦(您必须为 Action 命名,并调用两个方法将其绑定(bind)到KeyStroke 通过 InputMapAbstractAction 通过 ActionMap ),似乎它应该是分配要响应按键而调用的函数的第一个调用点。 KeyListener 使您能够做更多事情(例如奇特的组合键——超出 KeyStroke 所能处理的范围;并允许更早地访问按键事件,并能够 e .consume() 它),但键绑定(bind)更方便,因为它们可以预测基本用例。

相关点(由 related question 建议)是另一种处理文本组件的冗余机制,尤其是:DocumentListenersDocumentFilters .当重新映射键的原因是控制文本组件中的文本发生什么时,这些更加方便和防错。

另请参阅:关于键绑定(bind)系统从引入之日起如何工作的详细信息的报告,archived version .

关于java - Keymap、InputMap、ActionMap、KeyListener — 选择重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com