Java Swing:KEY_TYPED事件

时间:2016-08-01 19:46:37

标签: java swing character

我一直在尝试通过重写我之前使用KeyListener解决的书中的问题来学习键绑定。我正在努力使用keybinds解决的问题要求我记录一个已键入的消息并将其显示在面板上。

使用KeyListener解决它的方法只是使用keyTyped()方法记录带有unicodes的字符,并使用keyPressed读取修饰符/非Unicode键。如果KeyEvent.VK_ENTER与keyevent中的键码匹配,则它会在面板上显示该字符串。

~~~~~~~~

我认为它可以用类似的方式解决KeyBinds。它在KeyEvent文档中说每次输入一个字符时都会触发KeyEvent.KEY_TYPED。我认为这意味着每个具有相应Unicode的字符都会像在KeyListener中一样工作。

后来,我意识到我不知道如何检索字符,因为KeyBinds上的Oracle教程说当调用actionPerformed()时会消耗KeyEvent。

这是我认为能够使用KeyBindings将类型键记录到StringBuilder的代码:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.KEY_TYPED, 0), "recordTypedKey");
getActionMap().put("recordTypedKey", addCharToString);

有没有办法获得调用KeyListener的keyTyped()方法的字符,除了向每个字符添加一个键并使用单独的Action事件来记录它们?

1 个答案:

答案 0 :(得分:2)

  

有没有办法获取调用KeyListener的keyTyped()方法的字符,除了向每个字符添加一个键并使用单独的Action事件来记录它们?

我不相信有一个全局Realm.framework可以传递给与KeyListener类似的InputMap,因为KeyBindings在单个键的基础上工作。但是,您可以通过循环遍历要处理的char值来创建单个Action并将键绑定到它 - 在ActionListener实现中,您可以通过KeyStroke获取键的值。例如,处理a-z:

getActionCommand

如果需要,您可以添加修饰符...例如,处理shift键(例如大写),

AbstractAction action = new AbstractAction(){

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
    }

};
//loop over the ascii char values
for ( char a = 'A'; a <= 'Z'; a++ ){
     panel.getInputMap().put(KeyStroke.getKeyStroke(Character.toString(a)), "recordTypedKey");
}
panel.getActionMap().put("recordTypedKey", action);