1

任意のキーを押すと、KeyPressed、KeyTyped、KeyReleased の 3 つのイベントを受け取ります。KeyPressed と KeyReleased の場合、KeyPad などのキーがどこから来たかを認識します。ただし、KeyTyped イベントの場合、それがキーパッドから来たというすべての知識を失うようです。それはなぜですか?

これは、キーパッドで 4 キーを押したときの toString の一部です。

java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='4',keyLocation=KEY_LOCATION_UNKNOWN

キーパッドからのものであれば KeyPressed と KeyReleased を使用できますが、KeyTyped についても同じことを行う必要があります。

@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent) {
    if (keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD){
        keyEvent.consume();
        return true;
    } 
    return false;
}

だから私の質問は、キーパッドから来た場合に KeyTyped イベントを発行しないようにするにはどうすればよいですか?

ありがとう、

4

1 に答える 1

1

ドキュメントには次のように書かれています。

押された、または離されたキーの場所。KEY_TYPEDイベントの場合は常にKEY_LOCATION_UNKNOWNを返します。

その理由は、KEY_TYPEDイベントは一種の論理イベントであり、キーが入力された方法の低レベルの詳細を無視して、キーが入力されたことを通知するだけです。例:テキストエディタでは、キーがどのように入力されたか、または文字が生成されたかを知る必要はありません。そのようなアプリケーションのためにそれを知ろうとすることは一般的に非常に悪い考えと考えられています。

KEY_PRESSEDそしてKEY_RELEASED、はるかに物理的なイベントです。例:ゲームでは、リリースまたはプレスが生成されたときに別のことをしたい場合があります:プレス>>>実行の開始、リリース>>>>実行の停止。したがって、イベントの詳細とキーボードレイアウトに関心があるので、どの物理キーが使用されているかを知ることは興味深いかもしれません。

于 2013-01-29T15:08:37.357 に答える