我想确定area1, area2等的一些端口书写
void controlEvent(CallbackEvent event) {
if (event.getAction() == ControlP5.ACTION_CLICK) {
for (int i=1; i<13; i++){
switch(event.getController().getName()) {
case "Area" + str(i):
println("Button" + i + " Pressed");
if (port != null) port.write(i + "n");
break;}
}
}
}
但是我得到&;大小写表达式必须是常量表达式&;错误。有没有一种方法来使用for循环在切换情况?如果不是,重写上面代码的最合乎逻辑的方法是什么?
问题列表:
case "Area" + str(i):
如前所述,switch只需要常量,因此该值必须在编译时已知,而不是动态的。所以
case "Area1":
case "Area2":
... etc
如果你想更动态,那么使用If和else-if语句;
void controlEvent(CallbackEvent event) {
if (event.getAction() == ControlP5.ACTION_CLICK) {
for (int i=1; i<13; i++){
final String controlName = event.getController().getName();
if(controlName.equals("Area" + str(i))){
println("Button" + i + " Pressed");
if (port != null) {
port.write(i + "n");
}
break;
}
...
}}}
规范化操作名称并提取代码块是一个好主意。有13个if-else语句的切换案例可能很难阅读,所以最好提取方法来处理每个ControlP5
或conrtolName
第二种方法(可能有点太复杂,但仍然):创建动作映射:
Map<String, Consumer<Integer>> actionMap = new HashMap<>();
actionMap.put("Area1", i ->{
println("Button" + i + " Pressed");
if (port != null) {
port.write(i + "n");
}
});
actionMap.put("Area2", i ->{
println("Button" + i + " Pressed");
...
});
.. etc
现在你可以检查你的动作地图是否包含所需的controlName:
void controlEvent(CallbackEvent event) {
if (event.getAction() == ControlP5.ACTION_CLICK) {
final String controlName = event.getController().getName();
if(actionMap.hasKey(controlName)){
actionMap.get(controlName).apply(...)
break;
}
}
}
}