繁体   English   中英

Java Swing:KEY_TYPED事件的KeyBinding

[英]Java Swing: KeyBinding for KEY_TYPED event

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

使用KeyListener解决问题的方法很简单,就是使用keyTyped()方法以Unicode记录字符,并通过keyPressed读取修饰符/非Unicode键。 如果KeyEvent.VK_ENTER与键盘事件中的键盘代码匹配,则它将在面板上显示字符串。

~~~~~~~~~

我认为可以使用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);

除了向每个字符添加键并使用单独的Action事件记录它们之外,是否有其他方法可以获取将调用KeyListener的keyTyped()方法的字符?

除了向每个字符添加键并使用单独的Action事件记录它们之外,是否有其他方法可以获取将调用KeyListener的keyTyped()方法的字符?

我不认为可以传递给InputMap的全局KeyStroke类似于KeyListener,因为KeyBindings是基于单个键工作的。 但是,您可以通过循环处理要处理的char值来创建单个Action并将键绑定到其上-在ActionListener实现中,您可以通过getActionCommand获得键的值。 例如,处理az:

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

您可以根据需要添加修饰符...例如处理Shift键(例如大写字母),

panel.getInputMap().put(KeyStroke.getKeyStroke("shift " + Character.toString(a)), "recordTypedKey");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM