2015-09-23 5 views
0

Существует интерфейс, определяющий коды для клавиатуры. У каждой кнопки есть код.Получить поле по значению

public interface KeyMap{ 

private static final int A = 23; 
private static final int B = 24; 
//other keys 
... 
} 

Но мой вопрос: как получить письмо (A, B, ...) по номеру (23,24, ...). Что-то вроде:

public String getKey(int value); 

Я попытался решительность при создании карты, но тогда есть необходимо инициализировать полную карту снова и снова. Я думал о Java, но не могу найти правильный метод для этого.

+1

вы реализуете свой собственный коллекция, например 'Map' :) – Satya

+2

использует' HashMap' (или любую реализацию 'Map') и ставит значения типа' map.put («A», 23) '. Чтобы получить значение 'map.get (« A »)', возвращает '23' –

ответ

3

Java Reflection был бы возможен, но это было бы довольно медленно, так как вам нужно перебирать все поля, чтобы получить значение с правильным значением.

Еще одно предложение:

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 уже делает некоторые ключевые отображения, например.

Edit:

Хорошо, как вы, кажется, должны использовать предопределенные class, отражение на самом деле, кажется, единственный путь ... Этот метод позволит вам получить карту всего поля имена по значению.

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

Вы можете вызвать этот метод один раз в статической инициализации блока (смотри пример выше), чтобы создать карту один раз, а затем получить доступ к нему, что делает выполнения лучше:

static { 
    keyMap = getFieldsByValue(com.vaadin.event.ShortcutAction.KeyCode.class); 

    // example 
    String name = keyMap.get(23); // should be "A" 
} 
+0

Это действительно [ключевая карта vaadin's keyMap] (https://vaadin.com/api/com/vaadin/event/ShortcutAction.KeyCode.html), который используется для ярлыков, но также нужно также создать «окно справки» со всеми ярлыками на странице, поэтому я ищу способ получить имена ключей. – megabobik

+0

Хорошо, в этом случае отражение - это в значительной степени ваш единственный выбор. Будет обновлен ответ. –