【问题标题】:Java - Can we detect if a key is pressed without using a Listener?Java - 我们可以在不使用侦听器的情况下检测是否按下了某个键?
【发布时间】:2011-04-03 18:54:23
【问题描述】:

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

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

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

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

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

提前致谢,布赖恩

【问题讨论】:

  • 为什么你不能访问监听器?你不能自己创造吗?您使用的是什么 GUI 框架?
  • Noel - 似乎是我对 Erick Robertson 帖子的评论。

标签: java keyboard key pressed


【解决方案1】:

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

【讨论】:

  • 不是无限循环,不是。只是在特定操作期间按需调用(拖放期间的回调)。
【解决方案2】:

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

【讨论】:

  • 我同意,在理想的世界中,关键的听众可能是最好的。但是,在我看来,这种方法在我的场景中存在一些问题:我将侦听器附加到什么?我的应用程序在 UI 方面非常复杂,也可以通过插件进行自定义。我已经研究过将侦听器附加到事件线程,但这最终会处理所有关键事件,因此可能会对其他地方的性能产生影响。同样,应用程序的可扩展性意味着我不一定有办法检测拖动的开始 & 所以我不能有选择地打开监听器
  • 我刚刚玩了一个按键监听器,结果发现在按住鼠标按钮时按键事件不会被触发(我在这里使用拖放操作)和这样就排除了关键侦听器。我想我可以查看一个全局鼠标侦听器并检查修饰符的状态,但这对于这个问题来说似乎有点矫枉过正。
  • 我更新了我的回复 - 您可以检查每次移动或拖动鼠标时生成的 MouseEvent。
【解决方案3】:

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

【讨论】:

  • 我同意-但我无法弄清楚如何在代码中设置“无修饰符”的情况-javadocs(请参阅我原始帖子中的链接)表明复制优先于链接.如果您对如何执行此操作有任何建议,我们将不胜感激。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2014-07-13
    • 2023-03-14
    • 2017-09-03
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多