2

在执行包含“Alt”的键盘事件时,Mac/Java-7 不会针对 TextField 的键序列中的非修饰键传播 KEY_PRESSED。

此行为无法针对其他修饰键(如 Cmd 或 Ctrl)重现。

例如,当编译和运行以下代码并在 TextField 中执行 'Alt + o' 击键时,除 Mac/Java 7 之外的所有平台都输出以下键事件序列(请注意,对于 'alt ' 和 'o'):

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=18,keyText=?,keyChar=未定义keyChar,修饰符=?

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=79,keyText=O,keyChar='ø',修饰符=?

java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='ø',modifiers=?

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=79,keyText=O,keyChar='ø',修饰符=?...

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=18,keyText=?,keyChar=未定义...

但是,在 Mac/Java-7(测试到补丁 10)上,您会得到上面没有代表 'o' 的 KEY_PRESSED (KEY_PRESSED,keyCode=79,keyText=O,keyChar='ø')。KEY_TYPED 事件可能不是最有用的替代品,因为它没有修饰符或 keyCode,至少没有跟踪某些状态。

import javax.swing.*;
import java.awt.event.*;

public class ScratchKeyEvent {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();

    JTextField field = new JTextField(10);

    field.addKeyListener(createListener());

    frame.add(panel);
    panel.add(field);
    frame.setVisible(true);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private static KeyListener createListener() {
    return new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
            System.out.println("keyTyped " + e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("keyPressed " + e);
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("keyReleased " + e);
        }
    };
  }
}
4

0 回答 0