6

特定の操作中に特定のキー (CTRL など) が押されたかどうかを検出できる必要があります。キーリスナーにもマウスイベントにもアクセスできません。私が望んでいるのは、「boolean isKeyPressed(keycode)」のようなメソッドを持つクラスがあることです。

Javaでこのようなメソッドを知っている人はいますか?

ちょっとした背景として、コンポーネントのデフォルトのドラッグ アンド ドロップ動作をオーバーライドしようとしています。デフォルトでは、DropTargetDragEventの javadocs によると、キー修飾子が押されていない場合、コンポーネントのサポートされているアクション リストで移動、コピー、リンクの順に検索され、最初のアクションが見つかった後に停止します。

私のアプリケーションでは、コピーとリンクの両方をサポートしています。javadoc によると、CTRL キーを押さない場合のデフォルトのアクションはコピーです。ユーザーがデフォルトのアクションを指定して (最も一般的に使用されるアクションを設定できるようにする)、修飾キーを使用して特定のアクションを強制できるようにしたいと考えています。

キーが押された状態を検出できれば、これを強制的に実行できますが、デフォルトのアクションを変更する他の方法は見当たりません。

前もって感謝します、ブライアン

4

4 に答える 4

5

このMouseEvent.getModifiers()メソッドは、が生成されたときに押された修飾キーのビットマップを返しますMouseEventMouseEvent.isControlDown()または、 CTRLキーを具体的に確認するために使用できます。

于 2010-08-25T15:06:19.757 に答える
1

これは、おそらく汚い方法です。ただし、これにより、重要なイベントを「記録」してからクエリを実行できます。

//register this somewhere in the startup of your application
KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    mgr.addKeyEventDispatcher(KeyEventRecorder.getInstance());

//then can query events later
    KeyEvent keyEvt = KeyEventRecorder.getLastEvent();
    if( keyEvt != null && keyEvt.getKeyCode() == KeyEvent.VK_CONTROL && keyEvt.getID() == KeyEvent.KEY_PRESSED )
      //do something..

    private class KeyEventRecorder implements KeyEventDispatcher
    {
        private static KeyEvent lastEvent;
        private static KeyEventRecorder myInstance;

        private KeyEventRecorder()
        {
            super();
        }

        public static synchronized KeyEventRecorder getInstance()
        {
            if( myInstance == null )
                myInstance = new KeyEventRecorder();
            return myInstance;
        }

        /**
         *  retrieve the last KeyEvent dispatched to this KeyEventDispatcher
         */
        public static KeyEvent getLastEvent()
        {
            return lastEvent;
        }//method

        @Override
        public boolean dispatchKeyEvent(KeyEvent e)
        {
            lastEvent = e;
            //return false to let KeyboardFocusManager redistribute the event elsewhere
            return false;
        }//method
    }//class
于 2013-03-22T19:58:41.917 に答える
0

あなたはこれについて間違った方法で進んでいると思います。やりたいことは、ドラッグがドロップされたときではなく、ドラッグが開始されたときのアクションを変更することです。「修飾子なし」の場合にユーザー設定を調べるなど、開始時のアクションを変更する方法があります。DropTargetDragEvent の呼び出し方法を変更する可能性があります。

于 2010-08-25T15:20:03.517 に答える
0

そのような方法があったとしても、それをどうしたいですか?ある時点で true を返すことを期待して、無限ループで呼び出しますか? この場合、イベントベース/リスナーベースのメカニズムがはるかに適していると思います。

于 2010-08-25T14:56:56.483 に答える