0

我正在制作游戏,我希望控件是可编辑的。好吧,我已经把那部分记下来了,但是它们正在被读取和更改为 .txt 文件。这就是我希望它现在工作的方式。这些值存储为键值(即 KeyEvent.VK_W 等于 83,因此该行的值为 83)。我还让它读取值并将它们保存到我的核心类中的字符串数组变量中。在我的键事件类中,处理按键的推送,我让它引用数组来检查是否按下了命令键。我不断收到此错误:case expressions must be constant expressions当我尝试时。这是错误的代码:

switch(key){
  case Integer.parseInt(commands[1]):
      ...
      break;
}

我得到了那个错误。的值为commands[1]83。它是“W”的值。这是我对变量的声明:

for (int i = 0; i < commands.length; i++) {
                commands[i] = io.readSpecificLine(FILES.controlsFileFinalDir,
                        i + 1);
}

如果我让它打印出每个值,它确实有效。我试过制作阵列final,但没有奏效。大约 2 年前,我曾经遇到过该解决方案,但我再也找不到它了。有人对如何解决这个问题有任何想法吗?提前致谢!

4

2 回答 2

4

正如编译器所说,case 表达式必须是常量表达式。您不能将数组元素用作 case 表达式。您可以简单地使用if//子句else ifelse

于 2013-01-01T16:54:52.123 回答
1

您不能在case语句中使用非常量表达式。另一种方法是构建从值到操作的映射。所以代替这个(这对我来说实际上没有任何意义):

switch (key) {
case Integer.parseInt(commands[1]):
    // action 1
    break;
// other cases...
default: 
    // default action
}

你可以这样做:

static Map<Integer, Runnable> keyMap = new HashMap<Integer, Runnable>();
static {
    keyMap.put(83, new Runnable() {
        @Override
        public void run() {
            // actions for code 83
        }
    });
    . . .
}

(如果它更有意义,这也可以在每个实例的基础上完成,而不是作为静态地图。)然后:

Runnable action = keyMap.get(Integer.parseInt(commands[1]));
if (action != null) {
    action.run();
} else {
    // default action
}

如果您需要将变量传递给您的操作,您可以定义自己的接口而不是使用Runnable操作。

于 2013-01-01T17:00:35.673 回答