我编写了一个Swing GUI,它在JMenuItems上使用了KeyAccelerators。按下触发加速器的键较长时间会导致EventQueue堆叠命令并阻止GUI。我希望AWT事件队列中不要有多个(或两个)带有Control Modifier的KeyEvent。我试过这个:
AWTEvent awtevent = Toolkit.getDefaultToolkit()
.getSystemEventQueue().peekEvent();
if (awtevent != null) {
String paramString = awtevent.paramString();
if ((paramString.indexOf("modifiers=Ctrl") != -1 && ((KeyEvent) event)
.isControlDown())) {
((KeyEvent) event).consume();
} else if (paramString.indexOf("modifiers=Ctrl") != -1
&& (paramString.indexOf("keyChar=Undefined") != -1)) {
((KeyEvent) event).consume();
}
}
但它非常不可靠,因为它有时会消耗一个不应被消耗的事件。
答案 0 :(得分:2)
你不能从外面可靠地做到这一点。从事件派发线程外部操纵事件队列是不可线程安全的,并且您无法在事件派发线程上执行任务,该任务与该任务本身正在处理之前发布的事件相混淆。您可以每两秒或两次将清理任务推送到队列中,以处理尚未处理的事件,但是......只是不要。
如果您想过滤AWT / Swing事件,那么您需要安装自己的事件队列,这比听起来更容易。您可能会发现this article具有指导意义。