2

'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);
        }
    };
  }
}
4

0 に答える 0