6

我需要能够检测在我的特定操作期间是否按下了某个键(例如 CTRL)。我无权访问按键侦听器,也无权访问鼠标事件。我希望会有一些类具有像“boolean isKeyPressed(keycode)”这样的方法。

有人知道java中有这样的方法吗?

对于一些背景知识,我正在尝试覆盖组件的默认拖放行为。默认情况下,根据DropTargetDragEvent的 javadocs ,如果没有按下任何键修饰符,那么它会在组件支持的操作列表中查找移动,然后是副本和链接,并在找到第一个后停止。

在我的应用程序中,我们支持复制和链接。根据 javadoc,不按下 CTRL 键,默认操作是复制。我们希望用户能够指定默认操作(允许他们设置最常用的操作),然后使用修饰键强制执行特定操作。

如果我可以检测到按键状态,那么我可以强制这种情况发生,但我看不到任何其他更改默认操作的方法。

在此先感谢,布赖恩

4

4 回答 4

5

MouseEvent.getModifiers()方法将返回MouseEvent生成时按下的修饰键的位图。或者,您可以使用MouseEvent.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

就算有这样的方法,你想用它做什么?在无限循环中调用它,希望它在某个时候返回 true?我认为在这种情况下,基于事件/基于侦听器的机制更适合。

于 2010-08-25T14:56:56.483 回答
0

我认为你正在以错误的方式解决这个问题。您要做的是在启动拖动时更改操作,而不是在拖放时更改操作。有一些方法可以更改启动时的操作,包括在“无修饰符”情况下询问用户偏好。可能会更改 DropTargetDragEvent 的调用方式。

于 2010-08-25T15:20:03.517 回答