gpt4 book ai didi

java - swing 组件如何使用中间对象引用从它的 inputMap 中查找它的 ActionMap

转载 作者:行者123 更新时间:2023-11-30 09:49:29 24 4
gpt4 key购买 nike

我一直在阅读有关使用多个组件注册“Action”对象的文章,我发现了将 Action 对象注册(绑定(bind))到 Keystroke 的方法目的。

在追寻中我遇到了这段代码:

InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);
imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow", yellowAction)

现在它的工作方式是有一个间接级别来使用 Action 对象注册您的击键。首先,您将击键与组件的其中一个输入映射(在我们的示例中,它是对应于 WHEN_FOCUSED 常量的映射)中的某个任意对象相关联,然后您使用相同注册操作/strong> 引用,在另一个 map ActionMap 中,由组件维护。

现在我的疑问是,如果我假设将击键映射到 Action 对象的语义是通过使用驻留在这两个映射中的中间对象引用的相似性来完成的,那么这种相等性将始终成立的保证在哪里,除非我使用的对象引用确实定义了一个有效的相等概念(或哈希码)。

例如,在我的示例中,我在其中一个 InputMap 中附加了一个字符串“panel.yellow”实例的击键,然后我试图在其中附加一个具有相同字符串“panel.yellow”的操作对象Panel的ActionMap。现在,理论上,JVM 不保证这两个 String 实例(我已经硬编码)将引用同一个 String 对象!更糟糕的是,如果 JVM 不为字符串提供内容相等的概念,那么就没有办法将我的操作对象成功映射到我的击键。这对于我可以用来在中间将击键与操作对象绑定(bind)的任何对象都是如此,并且除了 Object 类定义的引用相等性之外,我没有为它们定义任何相等性(或哈希码)的概念。

谁能澄清一下。

爱维德

最佳答案

你是对的,两个字符串可能不是同一个对象,但你可以使用 equals(...) 方法检查是否相等,这很可能用于映射你的操作到击键。

请注意,除了 hashCode 之外,每个对象还提供了一个 equals(...) 方法,它可能与 == 相同对于任意对象,但 String 会覆盖它以进行内容相等性检查(如果您要为自定义对象覆盖该方法,您也会这样做)。

关于java - swing 组件如何使用中间对象引用从它的 inputMap 中查找它的 ActionMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753854/

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