java中检测某一个键的状态

在java gui界面开发中,有时候需要检测某一个键是否被按下,只是记录该键的状态,不通过

给某个组件添加键盘事件监听器,用到KeyboardFocusManager,KeyboardFocusManager

既是一个用于查询焦点所有者并启动焦点更改的客户端代码的集中位置,同时又是一个用于所

有 FocusEvent、与焦点相关的 WindowEvent 和 KeyEvent 的调度程序。 将

KeyEventDispatcher 添加到此 KeyboardFocusManager 的调度程序链中,在KeyEvent事

件响应前进行处理,查询某个键的状态。

public interface KeyEventDispatcher
在指派所有 KeyEvent 和为其确定目标时,KeyEventDispatcher 和当前 

KeyboardFocusManager 一起使用。在当前 KeyboardFocusManager 中注册的 

KeyEventDispatcher 在 KeyEvent 被指派到目标前接收它们,允许每个 

KeyEventDispatcher 重定向事件,使用它,指派事件本身,或者进行其他更改。 

KeyEventDispatcher 接口中的方法

boolean dispatchKeyEvent(KeyEvent e)当前 KeyboardFocusManager 调用此方法,请求

此 KeyEventDispatcher 为其指派指定的事件。此 KeyEventDispatcher 可以随意重定向事件

,使用它,指派它本身,或者进行其他更改。通常使用此功能将 KeyEvent 传递给 

Component 而不是焦点所有者。例如,可以使用此功能在可访问环境中导航不可聚焦 

Window 的子级。注意,如果 KeyEventDispatcher 指派 KeyEvent 本身,则其必须使用 

redispatchEvent 来防止当前 KeyboardFocusManager 递归式请求此 KeyEventDispatcher 

再次指派事件。 
如果此方法的实现返回 false,则将 KeyEvent 传入链中的下一个 KeyEventDispatcher,以当

前的 KeyboardFocusManager 结尾。如果实现返回 true,则假定已经指派了该 KeyEvent(

尽管事实不一定如此),当前 KeyboardFocusManager 将不对该 KeyEvent 进行任何进一步

的操作。在此情况下,KeyboardFocusManager.dispatchEvent 也应该返回 true。如果实现

使用 KeyEvent,但是返回 false,则仍将所使用的事件传入链中的下一个 

KeyEventDispatcher。开发人员在将 KeyEvent 指派到目标前首先检查它是否已使用至关重

要。默认情况下,当前 KeyboardFocusManager 不指派使用的 KeyEvent。 
参数:
e - 要指派的 KeyEvent 
返回:
如果 KeyboardFocusManager 不应对该 KeyEvent 进行进一步操作,则返回 true;否则,

返回 false

检测ctrl键和shift键是否按下,代码如下:

public static int keyCode = 0 ;//标识是否按下了ctrl,shift键
KeyboardFocusManager kfm = 

KeyboardFocusManager.getCurrentKeyboardFocusManager();
//添加键盘处理
        kfm.addKeyEventDispatcher(new KeyEventDispatcher()
        {
            public boolean dispatchKeyEvent(KeyEvent e)
            {
                int id = e.getID();
                switch(id)
                {
                case KeyEvent.KEY_PRESSED:                      if(e.getKeyCode()==KeyEvent.VK_CONTROL)
                        keyCode = KeyEvent.VK_CONTROL;
                    else if(e.getKeyCode()==KeyEvent.VK_SHIFT)
                        keyCode = KeyEvent.VK_SHIFT;
                    break;
                case KeyEvent.KEY_RELEASED:
                    keyCode = 0;
                }
                return false;
            }
        });

由于水平有限,如果有错误,请大家多多指导,提高水平,共同学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容