有一个界面,用于定义键盘代码。每个按钮都有代码。
public interface KeyMap{
private static final int A = 23;
private static final int B = 24;
//other keys
...
}
但我的问题是:如何按编号(23,24,...)获得字母(A,B,...)。 类似的东西:
public String getKey(int value);
我尝试解决创建Map的问题,但是需要一次又一次地初始化完整的Map。我认为Java反映但却无法找到正确的方法来实现它。
答案 0 :(得分:3)
另一个建议:
enum KeyCode {
A(23),
...;
private int code;
private static final Map<Integer, KeyCode> keys = new HashMap<Integer, KeyCode>();
static {
for(KeyCode code : values()) {
keys.put(code.code, code);
}
}
private KeyCode(int code) {
this.code = code;
}
public static KeyCode getKey(int code) {
return keys.get(code);
}
}
这可以让你简单地做...
KeyCode code = KeyCode.getCode(23);
String name = code.name(); // assuming not null here, should be "A"
这将非常快,等等。但是,当然,如果您不能使用现有框架,那么另一个问题就是。据我所知,Swing已经做了一些关键的映射,例如。
修改:
好的,因为您似乎必须使用预定义的class,反射实际上似乎是唯一的方法...此方法将允许您按值获取所有字段名称的映射。 / p>
public static Map<Object, String> getFieldsByValue(Class<?> clz) {
Map<Object, String> map = new HashMap<Object, String>();
// Remember: Class.getField() returns only PUBLIC fields
for (Field field : clz.getFields()) {
// Check if it's a static variable
if (Modifier.isStatic(field.getModifiers())) {
// Add other checks, for example for "integer", if you want.
try {
// field.get(null) returns the value of the field for a static field
map.put(field.get(null), field.getName());
} catch (IllegalArgumentException e) {
// should not happen, as we made sure the field is static
} catch (IllegalAccessException e) {
// should not happen, as we only listed public fields
}
}
}
return map;
}
您可以在静态初始化程序块中调用此方法一次(请参阅上面的示例)以创建Map一次然后访问它,这样可以使运行时更好:
static {
keyMap = getFieldsByValue(com.vaadin.event.ShortcutAction.KeyCode.class);
// example
String name = keyMap.get(23); // should be "A"
}