防止AWT事件队列超载

时间:2014-10-10 18:40:00

标签: java swing keyevent awt-eventqueue

我编写了一个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();

                    }
                }

但它非常不可靠,因为它有时会消耗一个不应被消耗的事件。

1 个答案:

答案 0 :(得分:2)

你不能从外面可靠地做到这一点。从事件派发线程外部操纵事件队列是不可线程安全的,并且您无法在事件派发线程上执行任务,该任务与该任务本身正在处理之前发布的事件相混淆。您可以每两秒或两次将清理任务推送到队列中,以处理尚未处理的事件,但是......只是不要。

如果您想过滤AWT / Swing事件,那么您需要安装自己的事件队列,这比听起来更容易。您可能会发现this article具有指导意义。