JDK-8 - java.awt.event.KeyEvent.getKeyChar()不起作用

时间:2018-05-01 14:21:33

标签: java java-8 keyboard

使用下面的代码,我们有两个行为,键入Til()字符键 在jdk 1.8.0_101上打印字符=>直到(
在Jdk上打印1.8.0_171 =>未定义( )字符。
我搜索谷歌和oracle文档,但没有发现任何关于这个。
显然这是最近的事情。 任何Ideia?

public class Sample extends JFrame {

private javax.swing.JTextField jTextField1;

public Sample() {
    setSize(200, 80);
    setLocationRelativeTo(null);
    jTextField1 = new javax.swing.JTextField();
    jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyReleased(java.awt.event.KeyEvent evt) {
            System.out.println(evt.getKeyChar());
        }
    });
    add(jTextField1);
}

public static void main(String[] args) {
    new Sample().setVisible(true);
}}

Jdk 1.8.0_171 Jdk 1.8.0_101

2 个答案:

答案 0 :(得分:1)

根据getKeyChar()方法的documentation

  

返回与此事件中的键关联的字符。例如,shift +" a"的KEY_TYPED事件返回" A"的值。   KEY_PRESSED和KEY_RELEASED事件不用于报告字符输入。因此,此方法返回的值保证仅对KEY_TYPED事件有意义。

因此,如果您只是想报告输入的字符,则应使用keyTyped()代替keyReleased()。它对我有用。这是keyTyped()方法的代码:

@Override
public void keyTyped(java.awt.event.KeyEvent evt){
    System.out.println(evt.getKeyChar());
}

答案 1 :(得分:0)

使用keyTyped不起作用,因为getKeyChar()也返回了我未定义的char。所以我在下面的KeyPress上做了一个解决方法。

public void keyPressed(KeyEvent evt) {
    if (JAVA_8 && evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
        callKeyPressedEvent: {
            switch (evt.getKeyCode()) {
                case 129:
                    evt.setKeyChar(((evt.getModifiers() & KeyEvent.SHIFT_MASK) == 1) ? '\u0060' : '\u00b4');//` and ´
                    break;
                case 131:
                    evt.setKeyChar(((evt.getModifiers() & KeyEvent.SHIFT_MASK) == 1) ? '\u005E' : '\u007E');//^ and ~
                    break;
                case 135:
                    if ((evt.getModifiers() & KeyEvent.SHIFT_MASK) == 1) {
                        evt.setKeyChar('\u00a8');//¨
                        break;
                    }
                default:
                    break callKeyPressedEvent;
            }

            processKeyEvent(evt);
        }
}