一、怎么做
可以安装一个具有自己的队列的全局侦听器,并且每个事件都轮询队列。Toolkit.addAWTEventListener(listener, eventMask)
有一个sun.awt.PeerEvent
(对于 sun impl)有一个ultimate priority
提供最简单的 impl,因为它实际上与 EventQueue.invokeLater 扩展相同,java.awt.event.InvocationEvent
但它又不是标准的。
最后:这里是如何完成标准方式的,虽然我没有测试过代码(懒惰和很晚)
class EventQueueX extends EventQueue{
final ConcurrentLinkedQueue<AWTEvent> que=new ConcurrentLinkedQueue<AWTEvent>();
@Override
public AWTEvent getNextEvent() throws InterruptedException {
AWTEvent e = que.poll();
if (e!=null)
return e;
return super.getNextEvent();
}
@Override
public synchronized AWTEvent peekEvent() {
AWTEvent e = que.peek();
if (e!=null)
return e;
return super.peekEvent();
}
public void pushFirst(AWTEvent e){
que.offer(e);
synchronized (this) {
notify();
}
}
public void install(Toolkit toolkit){
EventQueue q = toolkit.getSystemEventQueue();
if (q!=this)
q.push(this);
}
};
当你想要一个事件并且你已经设置好时,使用EventQueueX.install()
and then 。pushFirst(e)
不幸的是,队列将在异常时被卸载,并且也可能被推开。
接下来,为什么不好
的问题。总体而言,将事件放在队列的前面是一个坏主意。如果您稍后必须调用任何代码,只需构建您自己的设计并在函数结束时调用必要的代码,如果需要,请使用队列。
添加一个额外的超级最终优先级可能看起来不错,但对于任何常规 AWT/Swing(主要是 UI)开发人员来说,很难理解设计概念。如果您需要对操作进行排队,请使用您自己的迷你框架,而不会弄乱 awt。虽然我特别擅长黑客攻击,但即使是我自己,也会认为这种方法很奇怪(委婉地说)。