我一直在阅读有关使用多个组件注册“Action”对象的内容,我遇到了将操作对象注册(绑定)到按键的配方宾语。
在追求中,我遇到了这段代码:
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>引用,在另一个地图中,ActionMap,由组件维护。
现在我怀疑的是,如果我假设将击键映射到动作对象的语义是通过使用驻留在这两个映射中的中间对象引用的相似性来完成的,那么这种相等将始终保持的保证在哪里,除非我使用的对象引用确实定义了一个有效的相等概念(或hashcode)。
例如,在我的例子中,我在其中一个InputMaps中附加了一个String“panel.yellow”实例的击键,然后我试图附加一个具有相同String“panel.yellow”的动作对象Panel的ActionMap。现在,从理论上讲,JVM并不保证这些String实例(我已硬编码)都将引用相同的String对象!更糟糕的是,如果JVM没有为Strings提供内容相等的概念,那么就没有办法,我的动作对象可以成功映射到我的击键。对于我可能用来将键击与操作对象中间绑定的任何对象都是如此,并且除了Object类定义的引用相等之外,我没有定义任何相等(或哈希码)的概念。
请有人澄清一下。
AVID
答案 0 :(得分:1)
你是对的,两个字符串可能不是同一个对象,但你可以使用equals(...)
方法检查是否相等,这可能用于将你的动作映射到击键。
请注意,除了hashCode
之外,每个对象还提供equals(...)
方法,对于任意对象可能与==
方法相同,但String
会覆盖它以获取内容相等性检查(如果您为自定义对象覆盖该方法,您也可以这样做。)
答案 1 :(得分:1)
默认情况下,字符串是固定的,因此它们将是同一个对象。有关详细信息,请参阅String.intern()方法。
但如果您真的关心这一点,那么简单的解决方案就是在InputMap和ActionMap中使用相同的对象引用。
查看Key Bindings中的示例代码,其中显示了我如何执行此操作。