Во-первых, как это делается
Можно установить глобальный прослушиватель со своей собственной очередью и по одному событию, опрашивающему очередь.Toolkit.addAWTEventListener(listener, eventMask)
Существует sun.awt.PeerEvent
(для солнечного упоминания), который имеет ultimate priority
, который предлагает простейшее значение, поскольку он практически такой же, как 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()
, а затем pushFirst(e)
, когда выхотите событие, и все готово.К сожалению, очередь будет деинсталлирована при исключении и может быть также удалена.
Далее, почему это плохо К вопросу.поместить событие в начало очереди - плохая идея.Если позже вам придется вызывать какой-либо код, просто структурировать свой собственный дизайн и в конце функции вызвать необходимый код, используйте очередь, если вам это необходимо.
Добавление дополнительного уровня супер-конечного приоритета может выглядетьХорошо, но это трудно понять концепцию дизайна для любого обычного разработчика AWT / Swing (в основном пользовательского интерфейса).Если вам нужно ставить в очередь действия, используйте свою собственную мини-среду без путаницы с awt.В то время как я особенно хорош в хакерстве, даже сам, я бы подстроил такой подход (мягко говоря).