Java - 我们可以在不使用监听器的情况下检测是否按下了某个键吗?

时间:2010-08-25 14:51:32

标签: java keyboard key pressed

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

是否有人在java中意识到这样的方法?

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

在我的申请中,我们同时支持copy&链接。根据javadoc,没有按下CTRL键,默认操作是复制。我们希望用户能够指定默认操作(允许他们设置最常用的操作),然后使用修改键强制使用特定操作。

如果我能检测到按键状态,那么我可以强制执行此操作,但我看不到任何其他更改默认操作的方法。

先谢谢,Brian

4 个答案:

答案 0 :(得分:5)

MouseEvent.getModifiers()方法将返回在生成MouseEvent时按下的修饰键的位图。或者,您可以使用MouseEvent.isControlDown()专门检查CTRL键。

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为你这是错误的做法。您要做的是在启动拖动时更改操作,而不是在删除拖动时更改操作。有一些方法可以改变启动时的操作,包括在“无修饰符”情况下询问用户首选项。可能会改变调用DropTargetDragEvent的方式。