在执行包含“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);
}
};
}
}