java - 从KeyEvent获取所有key到map

标签 java reflection awt keylistener key-events

有没有办法从 java.awt.event.KeyEvent 获取所有键来映射?

我尝试使用反射,例如:

 for (Field f : KeyEvent.class.getDeclaredFields()) {
            try 
            {
                map.put((int)f.getInt(f), f.getName());
            } 
            catch (IllegalArgumentException | IllegalAccessException ex) {
                Logger.getLogger(KeyCollection.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

但是我得到了:

java.lang.IllegalAccessException: Class com.util.KeyCollection can not access a member of class java.awt.event.KeyEvent with modifiers "private"

更新:这是我使用 assylias 代码示例得出的结果:

 for (Field f : KeyEvent.class.getDeclaredFields()) {
            try {
                if (java.lang.reflect.Modifier.isStatic(f.getModifiers()) && f.getType() == int.class && f.getName().startsWith("VK")) {
                    f.setAccessible(true);
                    map.put((int)f.get(null), f.getName());
                }
            } catch (IllegalArgumentException | IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }

最佳答案

使用您的方法,您需要首先使该字段可访问:

f.setAccessible(true);

但是您尝试获取该字段的方式也存在问题。下面的示例运行良好,您可以根据需要进行调整:

public static void main(String[] args) {
    Map<Object, String> map = new HashMap<>();

    for (Field f : KeyEvent.class.getDeclaredFields()) {
        try {
            if (java.lang.reflect.Modifier.isStatic(f.getModifiers())) {
                f.setAccessible(true);
                map.put(f.get(null), f.getName());
            }
        } catch (IllegalArgumentException | IllegalAccessException ex) {
            ex.printStackTrace();
        }
    }
    System.out.println(map);
}

关于java - 从KeyEvent获取所有key到map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14303157/

相关文章:

c# - 如何形成一棵代表接口(interface)继承树的树?

java - 设置 java applet 的起始坐标

java - JToggleButton 不绘画

java - spring-xd如何使用source :file read line one by one

java - 为什么我的 clickListener 仅在我第二次调用它时才使我的应用程序崩溃

java - 如何使用 CLI 将模块添加到 Wildfly

java - 使用双缓冲有点毁了我的小程序。并且它有 java 使用或覆盖已弃用的 API

java - 在文本区域中转义 XML 标签

c# - 理解反射

java - 通过反射调用带有参数的方法