Java 类型不匹配:无法从KeyCode转换为KeyCode

Java 类型不匹配:无法从KeyCode转换为KeyCode,java,Java,所以我遇到了一个类型不匹配的奇怪情况。总的想法是,我正在创建一个游戏,玩家将能够定义自己的移动键绑定、按钮等 我从一个标准的键事件监听器开始,然后将它输入到一个键处理程序中 import javafx.event.EventHandler; import javafx.scene.input.KeyEvent; // Key event single key scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<K

所以我遇到了一个类型不匹配的奇怪情况。总的想法是,我正在创建一个游戏,玩家将能够定义自己的移动键绑定、按钮等

我从一个标准的键事件监听器开始,然后将它输入到一个键处理程序中

import javafx.event.EventHandler;
import javafx.scene.input.KeyEvent;

// Key event single key
    scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
        public void handle(KeyEvent key) {
                btnHand.keyPressHandler(key.getCode());
        }
    });

import javafx.scene.input.KeyCode;

public void keyPressHandler(KeyCode keyCode) {
    switch (keyCode) {
    case GameOptions.getMoveNorth():    //method call           break;
    case GameOptions.getMoveSouth():    //method call           break;
    case GameOptions.getMoveWest():     //method call           break;
    case GameOptions.getMoveEast():     //method call           break;


    default:    System.out.println("key : " + keyCode + " was pressed, yet has no handler");
    }
}
但我现在不明白为什么它会导致我的眼睛类型不匹配,因为它们是同一类型的。将我引向正确方向的指针会很好

注意:我确信这个答案确定了一个问题,但我一点也不相信它是您确定的准确错误消息的来源,它与您收到的非常量
案例
标签的错误并不匹配。将更新澄清,将留在这里,因为现在是

虽然错误相当隐晦,但基本问题是
case
只接受,方法调用和变量是不可接受的。在您当前的体系结构中,最简单的方法是使用
if
,因为没有理由必须使用
开关:

public void keyPressHandler(KeyCode keyCode) {
    if (keyCode == GameOptions.getMoveNorth()) {
        ...
    } else if (keyCode == GameOptions.getMoveSouth()) {
        ...
    } else if (keyCode == GameOptions.getMoveWest()) {
        ...
    } else if (keyCode == GameOptions.getMoveEast()) {
        ...
    } else {
        System.out.println("key : " + keyCode + " was pressed, yet has no handler");    
    }
}
为了完整性,如果您坚持在那里使用
开关
,标签必须是常量,因此您唯一的选择是将关键代码翻译移到其他位置,例如(选择
操作
成为
游戏选项
的成员只是为了简化此示例):

然后您的处理程序变成:

public void keyPressHandler(KeyCode keyCode) {
    switch (GameOptions.getActionFromKeyCode(keyCode)) {
    case GameOptions.Action.MOVE_NORTH: ...; break;
    case GameOptions.Action.MOVE_SOUTH: ...; break;
    case GameOptions.Action.MOVE_WEST: ...; break;
    case GameOptions.Action.MOVE_EAST: ...; break;
    default: ...; break;
    }
}
然而,这种方法有一些警告:

  • 这意味着
    GameOptions
    必须知道所有键绑定,否则
    keyPressHandler
    会变得更复杂
  • 它将一些用户界面逻辑移出用户界面,进入
    GameOptions
    ,这在某些情况下在架构上很奇怪,在更复杂的场景中可能会出现问题
  • if
    方法相比,它并没有给您带来太多好处,它更为冗长,在这里没有真正的好处。不管怎样,您仍然需要在
    getActionFromKeyCode
    中实现相同的大
    ,与原始版本相同,只是移动到了不同的地方

这不是你的最佳选择,但我想把它作为一个概念来考虑。如果

,我就用
这个词,结合我以前的知识和映射的思想,我已经得出了一个很好的结论。我觉得现在就可以了,将来可能会掉下去…谁知道…到下一个新事物上

public void keyPressHandler(KeyCode keyCode) {

    HashMap<KeyCode, String> kmap = new HashMap<KeyCode, String>();

    kmap.put(GameOptions.getMoveNorth(), "north");
    kmap.put(GameOptions.getMoveEast(), "east");
    kmap.put(GameOptions.getMoveSouth(), "south");
    kmap.put(GameOptions.getMoveWest(), "west");

    String kact = kmap.get(keyCode);

    if (kact == null) {
        kact = "";
    }

    switch(kact) {
    case "north":
        northButtonHandler();
        break;
    case "east":
        eastButtonHandler();
        break;
    case "south":
        southButtonHandler();
        break;
    case "west":
        westButtonHandler();
        break;
    default:
        System.out.println("key : " + keyCode + " has been pressed, yet has no binding");
    }
}
public void keyPressHandler(KeyCode-KeyCode){
HashMap kmap=新的HashMap();
kmap.put(GameOptions.getMoveNorth(),“north”);
kmap.put(GameOptions.getMoveEast(),“east”);
kmap.put(GameOptions.getMoveSouth(),“south”);
kmap.put(GameOptions.getMoveWest(),“west”);
字符串kact=kmap.get(keyCode);
如果(kact==null){
kact=“”;
}
开关(kact){
“北”案:
northButtonHandler();
打破
“东”案:
eastButtonHandler();
打破
“南方”案:
southButtonHandler();
打破
“西部”案:
westButtonHandler();
打破
违约:
System.out.println(“键:“+keyCode+”已按下,但没有绑定”);
}
}

我建议不要在switch语句中使用方法。创建一个键-操作映射并仅处理操作。在其他新闻中,可以绑定到键。您能否在此处包括每个类文件顶部的完整
import
语句集,以及您收到的确切编译器错误?@JasonC添加了import语句。错误消息出现在my switch中的方法调用上,错误与标题完全相同,suugested修复程序正在向KeyCode添加强制转换,或者将getter的返回类型更改为KeyCode@JasonC错误为“类型不匹配:无法从KeyCode转换为KeyCode”。然后,我尝试将方法调用从switch语句中取出,将该方法分配给一个变量,然后在switch中使用该变量。这会导致错误“无法解决或不是字段”。我想问题是我遇到了你提到的关于案例陈述是常数的问题。关于如何处理这个问题,我可能不得不考虑其他的选择。谢谢你的帮助,我想现在我可能会转向if方法,让事情真正起作用。不过,我还将学习inputmap/actionmaps,因为这似乎是一个更“可扩展”的解决方案,如果statement@Fluke最终,操作图/输入图将是最合适的方式。
public void keyPressHandler(KeyCode keyCode) {
    switch (GameOptions.getActionFromKeyCode(keyCode)) {
    case GameOptions.Action.MOVE_NORTH: ...; break;
    case GameOptions.Action.MOVE_SOUTH: ...; break;
    case GameOptions.Action.MOVE_WEST: ...; break;
    case GameOptions.Action.MOVE_EAST: ...; break;
    default: ...; break;
    }
}
public void keyPressHandler(KeyCode keyCode) {

    HashMap<KeyCode, String> kmap = new HashMap<KeyCode, String>();

    kmap.put(GameOptions.getMoveNorth(), "north");
    kmap.put(GameOptions.getMoveEast(), "east");
    kmap.put(GameOptions.getMoveSouth(), "south");
    kmap.put(GameOptions.getMoveWest(), "west");

    String kact = kmap.get(keyCode);

    if (kact == null) {
        kact = "";
    }

    switch(kact) {
    case "north":
        northButtonHandler();
        break;
    case "east":
        eastButtonHandler();
        break;
    case "south":
        southButtonHandler();
        break;
    case "west":
        westButtonHandler();
        break;
    default:
        System.out.println("key : " + keyCode + " has been pressed, yet has no binding");
    }
}