Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—我们是否可以在不使用侦听器的情况下检测按键?_Java_Keyboard_Key_Pressed - Fatal编程技术网

Java—我们是否可以在不使用侦听器的情况下检测按键?

Java—我们是否可以在不使用侦听器的情况下检测按键?,java,keyboard,key,pressed,Java,Keyboard,Key,Pressed,我需要能够检测在我的特定操作过程中是否按下了某个键(如CTRL)。我没有访问键侦听器的权限,也没有访问鼠标事件的权限。我希望有一个类有一个类似“booleaniskeypressed(keycode)”的方法 有人知道java中有这样的方法吗 作为一点背景,我试图覆盖组件的默认拖放行为。默认情况下,根据javadocs for,如果没有按下键修饰符,那么它会在组件的支持操作列表中查找移动,然后是副本&然后是链接,并在找到第一个后停止 在我的应用程序中,我们支持复制和链接。根据javadoc,如果

我需要能够检测在我的特定操作过程中是否按下了某个键(如CTRL)。我没有访问键侦听器的权限,也没有访问鼠标事件的权限。我希望有一个类有一个类似“booleaniskeypressed(keycode)”的方法

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

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

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

如果我能检测到按键的状态,那么我就可以强迫它发生,但我看不到任何其他改变默认动作的方法


提前谢谢,布莱恩

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

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

我认为您这样做是错误的。您要做的是在开始拖动时更改操作,而不是在拖放时更改操作。有多种方法可以更改启动时的操作,包括在“无修改器”情况下询问用户偏好。有可能更改DropTargetDrageEvent的调用方式。

这可能是一种肮脏的方式。但这允许您“记录”关键事件,然后查询它们

//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

为什么你没有访问侦听器的权限?你不能创造你自己的吗?你在使用什么GUI框架?Noel-我似乎对Erick Robertson的帖子发表了评论。我同意-但我还没有弄清楚如何在代码中设置“无修改器”的情况-javadocs(见我原始帖子中的链接)表明复制优先于链接。如果您对如何执行此操作有任何建议,将不胜感激。不是无休止的循环,不是。只是在特定操作期间按需调用(拖放期间回调)。我同意在理想情况下,键侦听器可能是最好的。然而,在我看来,这种方法在我的场景中存在一些问题:我应该将侦听器附加到什么?我的应用程序在UI方面相当复杂,并且可以通过插件进行定制。我已经研究过将侦听器附加到事件线程,但这最终会处理所有关键事件&因此可能会影响其他地方的性能。类似地,应用程序的可扩展性意味着我不一定有办法检测拖动的开始&因此我不能有选择地打开侦听器,因为我刚刚玩了一个键侦听器,结果是当按下鼠标按钮时,不会触发键事件(我正在使用拖放)这就排除了一个键侦听器。我想我可以查看一个全局鼠标侦听器并检查修改器的状态,但对于这个问题来说,这似乎太过分了。我更新了我的响应-你可以在每次移动或拖动鼠标时检查生成的MouseEvent。