Java—我们是否可以在不使用侦听器的情况下检测按键?
我需要能够检测在我的特定操作过程中是否按下了某个键(如CTRL)。我没有访问键侦听器的权限,也没有访问鼠标事件的权限。我希望有一个类有一个类似“booleaniskeypressed(keycode)”的方法 有人知道java中有这样的方法吗 作为一点背景,我试图覆盖组件的默认拖放行为。默认情况下,根据javadocs for,如果没有按下键修饰符,那么它会在组件的支持操作列表中查找移动,然后是副本&然后是链接,并在找到第一个后停止 在我的应用程序中,我们支持复制和链接。根据javadoc,如果不按CTRL键,默认操作是复制。我们希望用户能够指定默认操作(允许他们设置最常用的操作),然后使用修改器键强制执行特定操作 如果我能检测到按键的状态,那么我就可以强迫它发生,但我看不到任何其他改变默认动作的方法Java—我们是否可以在不使用侦听器的情况下检测按键?,java,keyboard,key,pressed,Java,Keyboard,Key,Pressed,我需要能够检测在我的特定操作过程中是否按下了某个键(如CTRL)。我没有访问键侦听器的权限,也没有访问鼠标事件的权限。我希望有一个类有一个类似“booleaniskeypressed(keycode)”的方法 有人知道java中有这样的方法吗 作为一点背景,我试图覆盖组件的默认拖放行为。默认情况下,根据javadocs for,如果没有按下键修饰符,那么它会在组件的支持操作列表中查找移动,然后是副本&然后是链接,并在找到第一个后停止 在我的应用程序中,我们支持复制和链接。根据javadoc,如果
提前谢谢,布莱恩即使有这样的方法,你想用它做什么?在一个无休止的循环中调用它,希望它在某个时刻返回真值?我认为基于事件/侦听器的机制更适合这种情况。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。