我需要能够检测在我的特定操作期间是否按下了某个键(例如CTRL)。我无权访问密钥监听器,也无法访问鼠标事件。我希望有一些类有一个类似“boolean isKeyPressed(keycode)”的方法。
是否有人在java中意识到这样的方法?
对于一些背景知识,我试图覆盖默认的拖动和放大删除组件的行为。默认情况下,根据DropTargetDragEvent的javadocs,如果没有按下任何键修饰符,则它会在组件的支持操作列表中查找移动,然后是副本&找到第一个链接并停止。
在我的申请中,我们同时支持copy&链接。根据javadoc,没有按下CTRL键,默认操作是复制。我们希望用户能够指定默认操作(允许他们设置最常用的操作),然后使用修改键强制使用特定操作。
如果我能检测到按键状态,那么我可以强制执行此操作,但我看不到任何其他更改默认操作的方法。
先谢谢,Brian
答案 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的方式。