web-dev-qa-db-ja.com

KeyListenerはキーの組み合わせをどのように検出できますか(ALT + 1 + 1など)

カスタムKeyListenerALT(またはその点ではCTRL)+複数の他のキーの組み合わせをリッスンさせるにはどうすればよいですか?

押されたキーの組み合わせに応じて、アプリケーションに実行させたいアクションが11あるとします。 ALT + 0-ALT + 9は明らかに問題を引き起こしませんが、ALT + 1 + 0(または、ヘルプファイルなどで説明されている可能性があるため、「ALT + 10」)Web(または私の頭の中)のどこにも適切な解決策が見つかりません。 このタイマー付きのソリューション が唯一の可能な方法であるとは確信していません。

事前に何百万もの提案をありがとう!

編集:アクション0-9 +アクション10 = 11アクション。 @ X-Zeroに感謝します。

19
s.d

このタイプの対話にはKeyListenerを使用しないでください。代わりに、 Javaチュートリアル で参照できるキーバインディングを使用します。次に、 InputEvent マスクを使用して、さまざまな修飾キーが廃止される時期を表します。例えば:

// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                            Java.awt.event.InputEvent.CTRL_DOWN_MASK),
                    "actionMapKey");
component.getActionMap().put("actionMapKey",
                     someAction);

KeyStrokeの取得中に使用できるさまざまなコードについては、javadocの KeyStroke を参照してください。これらの修飾子をORで結合して、キーのさまざまな組み合わせを表すことができます。といった

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                       Java.awt.event.InputEvent.CTRL_DOWN_MASK
                       | Java.awt.event.InputEvent.SHIFT_DOWN_MASK)

Ctrl + Shiftキーが押されました。

編集:指摘したように、これはあなたの質問には答えませんが、代わりにいくつかの良いアドバイスとしてとるべきです。

27

この目的でKeyListenerを使用するには、特定のものを組み合わせます。オーバーライドされたkeyPressed(KeyEvent e)メソッドに配置する必要がある次の例を見てください。

_if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
        System.out.println("Select All"); 
}
_

文字列_Select All_は次の場合に表示されます Ctrl + a が押されます。メソッドe.isControlDown()は、 Ctrl キーが押されたかどうか。同様に、 Alt キーの組み合わせは、e.isAltDown()メソッドを使用して同じメソッドで実行できます。

この背後にあるロジックは、e.getKeyChar()はキーを押した文字を返し、_e.getKeyCode()はそのASCIIコードを返します。 Ctrl を押し続けると、e.getKeyChar()aを返さず、e.getKeyCode()は同じ_65_になります。これを理解してほしい。詳細についてはお気軽にお問い合わせください。

19
Sasivarnan

ALT + 1 + 0(または「ALT + 10」はヘルプファイルなどで説明できるため)

(あなたのコメントの1つから)と衝突するようです:

したがって、たとえば、ユーザーが列11( "10"と呼ばれる)のデータを変更する場合は、ALT + 1 + [ALTと1の両方を放す] 0を押します。

ALT + 10が「ALTを押して、1を押して離し、0を押して離し、ALTを離す」という意味だとすると、これを試すことをお勧めします。

KeyPressedで、ALTキーをリッスンし、ブールフラグisAltPressedをアクティブにし、発生するキープレス(文字列など)を保持するためのバッファーを作成します。 keyTypedで、isAltPressedがアクティブな場合、キーコードをバッファに追加します。 keyReleasedで、ALTをもう一度リッスンし、バッファをクエリしてアクションを実行する条件付きクエリを開きます。

    public void keyPressed (KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_ALT){
        buffer = ""; //declared globally
        isAltPressed = true; } //declared globally
    }

    public void keyTyped (KeyEvent e){
        if (isAltPressed)
            buffer.append (e.getKeyChar());
    }

    public void keyReleased (KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_ALT){
            isAltPressed = false;
            if (buffer.equals (4948)) //for pressing "1" and then "0"
                doAction();
            else if (buffer.equals(...))
                doOtherAction();
            ...
        }//if alt
    }
2
sideways8

私が使用しているより簡単な方法があると思います。 KeyEventがevの場合、調査すると次のようになります。

(int)ev.getKeyChar()

あなたはそれを見つける ctrl-a 1です ctrl-b は2などです。使いたかった ctrl-s 保存のため。だから私はただ使う:

(((int)ev.getKeyChar())==19)

それを検出します。理由はわかりませんが、正常に機能します。

ev.isControlDown() && ev.getKeyChar()=='s'

ではない。

0
dave110022

キーの組み合わせを使用する代わりに、ウィンドウisVisible()がフォーカスされているときに、いくつかの入力フィールドを検討することをお勧めします。このフィールドは、Windowsのファイルエクスプローラーの非表示のファイル名検索(ディレクトリを入力し、ファイル名を入力すると、対応がフォーカスされる)のように非表示にすることも、Ubuntuのように表示することもできます。

キーの組み合わせは、モディファイア以外の複数のキーを含めるようには設計されていませんが、実現できる場合があります。

0
WesternGun
import Java.awt.*;
import Java.awt.event.*;
class KDemo
{
     public static void main(String args[])
     {
           Frame f = new Frame();
           f.setSize(500,500);
           f.setVisible(true);
           f.addKeyListener(new KeyAdapter()
           {
               public void keyPressed(KeyEvent e)
               {
                   AWTKeyStroke ak = AWTKeyStroke.getAWTKeyStrokeForEvent(e);
                   if(ak.equals(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK)))
                   {
                     System.exit(0);
                   }
               }
           });
        }
   }
0
Venkat Esan