Java - Можем ли мы определить, нажата ли клавиша без использования прослушивателя? - PullRequest
6 голосов
/ 25 августа 2010

Мне нужно быть в состоянии определить, была ли нажата определенная клавиша (например, CTRL) во время моей конкретной операции.У меня нет доступа ни к ключевому слушателю, ни к событию мыши.Я надеюсь, что будет какой-то класс, у которого есть метод типа «boolean isKeyPressed (keycode)».

Кто-нибудь знает такой метод в java?

Длянемного фона, я пытаюсь переопределить стандартное поведение перетаскивания для компонента.По умолчанию, согласно javadocs для DropTargetDragEvent , если не нажимается ни один ключевой модификатор, он просматривает список поддерживаемых действий компонента для перемещения, затем копирует & затем ссылку и останавливается после нахождения первогоone.

В моем приложении мы поддерживаем как копирование, так и ссылку.Согласно javadoc, без нажатой клавиши CTRL, действием по умолчанию является копирование.Мы хотим, чтобы пользователь мог указать действие по умолчанию (позволяя ему установить наиболее часто используемые), а затем принудительно назначить конкретное действие с помощью клавиш-модификаторов.

Если я могу обнаружить нажатие клавиши, то я могузаставить это произойти, но я не вижу другого способа изменить действие по умолчанию.

Заранее спасибо, Брайан

Ответы [ 4 ]

5 голосов
/ 25 августа 2010

Метод MouseEvent.getModifiers() возвращает битовую карту клавиш-модификаторов, которые были нажаты во время создания MouseEvent.Или вы можете использовать MouseEvent.isControlDown(), чтобы специально проверить клавишу CTRL.

1 голос
/ 22 марта 2013

Это возможно грязный способ сделать это.Но это позволяет вам «записывать» ключевые события и затем запрашивать их.

//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
0 голосов
/ 25 августа 2010

Я думаю, вы поступаете неправильно. То, что вы хотите сделать, это изменить действие, когда начинается перетаскивание, а не когда оно отбрасывается. Существуют способы изменить действие при инициировании, включая опрос пользовательских настроек в случае «без модификаторов». Возможно, что изменился способ вызова DropTargetDragEvent.

0 голосов
/ 25 августа 2010

Даже если бы существовал такой метод, что вы хотите с ним сделать? Назовите это в бесконечном цикле в надежде, что в какой-то момент он вернется? Я думаю, что механизм, основанный на событиях / слушателях, в этом случае подходит намного лучше.

...