【问题标题】:Keymap, InputMap, ActionMap, KeyListener — choice overloadKeymap、InputMap、ActionMap、KeyListener——选择重载
【发布时间】:2016-08-07 10:42:51
【问题描述】:

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

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

  • addKeymap(..)setKeymap(..)。一个Keymap 有一个addActionForKeyStroke(..),它接受一个KeyStroke(我们可以通过调用KeyStroke 指定字符或键码的静态方法得到)和一个Action,这是一个ActionListener花里胡哨。

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

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

【问题讨论】:

  • 4 次投反对票,没有一条评论。我将此解释为“您应该花一个小时阅读而不是询问,因为这些信息可以在 Internet 上获得”。好吧,好吧,但不是在一个简洁的页面上。该网站的重点是将重点聚集在一起,避免为了回答一个问题而费力地翻阅几十个不相关的页面。
  • 是的,为什么不呢,这是一个众说纷纭的公共论坛,部分阴影命令是在 UIManager 中实现的(标准快捷方式,你可能知道 fom/in Windows OS)

标签: java swing keylistener key-bindings jcomponent


【解决方案1】:
  • InputMap + ActionMap 系统在 1.3 中引入并替换了旧的 Keymap(使用 InputMap + ActionMap 系统在底层重新实现,以实现向后兼容性)。新系统具有Keymap 功能的超集。 (来自 Loy 和 Eckstein 的 O'Reilly 书籍 Java Swingpage 755。)

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

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

    • KeyListeners 方法需要更多的工作,因为焦点和组件包含层次结构(它没有意识到)问题。例如,如果我们有一个表格组件和一个包含在其中的表格单元组件,它具有焦点,按下 键将向表格单元组件发送事件,这取决于我们将它们中继到表格(因为我们要更改表格当前选定的单元格)。

    • 相比之下,键绑定让我们直接指定父组件上的绑定:每个JComponent三个 InputMaps 和一个ActionMap。输入映射属于以下类型:JComponent.WHEN_FOCUSEDWHEN_ANCESTOR_OF_FOCUSED_COMPONENTWHEN_IN_FOCUSED_WINDOW。与侦听器不同的是,所有KeyListeners 在焦点组件上 only 都按顺序处理,通过键绑定,事件将向上传播(嗯,我认为是一棵树,因为有每个组件只有一个父级),直到它找到一个动作(未被禁用),也就是它停止的时候。在此搜索过程中,第二类InputMap 优先于第三类。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多