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");
}
}