'Alt'を含むキーボードイベントを実行する場合、Mac / Java-7は、TextFieldsに対するキーシーケンスの非修飾子キーに対してKEY_PRESSEDを伝播しません。
この動作は、CmdやCtrlなどの他の修飾キーに対しては再現できません。
たとえば、以下のコードをコンパイルして実行し、TextFieldで「Alt + o」キーストロークを実行すると、Mac / Java 7を除くすべてのプラットフォームで、次のキーイベントシーケンスが出力されます(両方の「alt」にKEY_PRESSEDがあることに注意してください)。 'および'o'):
java.awt.event.KeyEvent [KEY_PRESSED、keyCode = 18、keyText = ?, keyChar = Undefined keyChar、modifiers =?
java.awt.event.KeyEvent [KEY_PRESSED、keyCode = 79、keyText = O、keyChar ='ø'、modifiers =?
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 ='ø'、modifiers =?..。
java.awt.event.KeyEvent [KEY_RELEASED、keyCode = 18、keyText = ?, keyChar = Undefined .. ..
ただし、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);
}
};
}
}