0

我编写了一个 Swing GUI,它在 JMenuItems 上使用 KeyAccelerators。长时间按下触发加速器的键会导致 EventQueue 堆叠命令并阻塞 GUI。我希望 AWT 事件队列中的控制修饰符不超过一个(或两个)KeyEvents。我试过这个:

         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();

                    }
                }

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

4

1 回答 1

2

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

如果要过滤 AWT / Swing 事件,则需要安装自己的事件队列,这比听起来容易。你可能会发现这篇文章很有启发性。

于 2014-10-10T20:18:22.647 回答