【发布时间】:2015-09-18 05:32:52
【问题描述】:
我有一个关于键绑定的问题。我有以下 Java 代码:
private void registerPressedReleasedKey(String keyChar, boolean key, boolean pressedKey) {
// 1. decide if the key is pressed or released
// 2. save key and its action name
// 3. decide, what to do, when the action name is being mentioned
// 4. change the boolean value in actionPerformed(ActionEvent ae)
String keyStatus;
if(pressedKey == true)
keyStatus = "pressed ";
else
keyStatus = "released ";
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(keyStatus + keyChar), keyStatus + keyChar);
getActionMap().put(keyStatus + keyChar, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
key = pressedKey;
}
});
}
Eclipse 对我说key = keyPressed; 是错误的,因为我只能使用final 变量。我的问题是是否有可能在actionPerformed(ActionEvent ae) 方法中访问和更改key。
【问题讨论】:
-
从技术上讲,您需要
key的最终持有者对象。最终保证,您不能为 holder 变量分配新引用,但final不会阻止通过 setter 更新 holder 对象的状态。 -
上面的匿名类代码在很多层面上都是错误的:a) 它试图设置
key变量,它是 1. 外部方法参数,2. 除此以外的任何地方都未使用参数,3. 不返回也不存储在任何地方,b) 它使用隐式线程代码 -getActionMap()&AbstractAction表明正在使用 Swing 组件,这意味着actionPerformed()将被 Swing 线程调用,并且代码以上可能会在主线程中执行。因此,该代码本质上是错误的。您无法分配key的事实是您遇到的最小问题。 -
@RomanVottner 同意,但请参阅我上面的评论。
-
@vaxquis 这就是我写评论并提到技术方面的原因 - 我没有努力纠正 OP 的设计