Como replace o AWT EventQueue pela própria implementação

Para depurar comportamentos estranhos em um aplicativo Swing, gostaria de replace o AWT EventQueue por minha própria implementação.

Isso é possível? Como?

Apenas no caso de você estar interessado:

  • a implementação será um simples wrapper ao redor do Eventqueue normal, fazendo alguns logs.

  • o problema que eu gostaria de depurar é um TableCellEditor, que funciona bem em um pequeno aplicativo de demonstração, mas quando colocado na aplicação real, o stopCellEditing é chamado imediatamente, devido a algum evento. Eu gostaria de ter access ao evento para descobrir de onde ele vem.

EventQueue tem um método chamado push () que fará exatamente o que você deseja. Aqui está uma pequena demonstração:

public class QueueTest { public static void main(String[] args) throws InterruptedException, InvocationTargetException { EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); eventQueue.push(new MyEventQueue()); EventQueue.invokeAndWait(new Runnable() { public void run() { System.out.println("Run"); } }); } private static class MyEventQueue extends EventQueue { public void postEvent(AWTEvent theEvent) { System.out.println("Event Posted"); super.postEvent(theEvent); } } } 

Seja cauteloso com o java 1.7. Existe um bug . A solução postada pelo rancidfishbreath é perfeita com o java 1.6, mas resulta em um aplicativo Swing que nunca sai com o java 1.7. No JDK 1.7, você precisa instalar o novo EvenQueue no encadeamento Event Dispatch … e fora dele no JDK 1.6 … Escreva uma vez, rode em qualquer lugar 😉

Aqui está uma solução universal … espero, 1.8 não vai mudar isso 😉

 import java.awt.AWTEvent; import java.awt.EventQueue; import java.awt.Toolkit; import java.lang.reflect.InvocationTargetException; public class QueueTest { public static void main(String[] args) throws InterruptedException, InvocationTargetException { if (!isJava7Like()) setQueue(); EventQueue.invokeAndWait(new Runnable() { public void run() { if (QueueTest.isJava7Like()) setQueue(); System.out.println("Run"); } }); } private static void setQueue() { EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); eventQueue.push(new MyEventQueue()); } private static boolean isJava7Like() { return Float.parseFloat(System.getProperty("java.specification.version")) > 1.6; } private static class MyEventQueue extends EventQueue { public void postEvent(AWTEvent theEvent) { System.out.println("Event Posted"); super.postEvent(theEvent); } } } 

Isto é bom. Estendendo EventQueue lhe dará uma alça em todos os AWTEvents.

Como você conseguirá lidar com todos os events? Lista de events é como abaixo.

[AWTEvent, BeanContextEvent, CaretEvent, ChangeEvent, ConnectionEvent, DragGestureEvent, DragSourceEvent, DropTargetEvent, FlavorEvent, HandshakeCompletedEvent, HyperlinkEvent, LineEvent, ListDataEvent, ListSelectionEvent, MenuEvent, NamingEvent, NamingExceptionEvent, NodeChangeEvent, Notificação, PopupMenuEvent, PreferenceChangeEvent, PrintEvent, PropertyChangeEvent, RowSetEvent, RowSorterEvent , SSLSessionBindingEvent, StatementEvent, TableColumnModelEvent, TableModelEvent, TreeExpansionEvent, TreeModelEvent, TreeSelectionEvent, UndoableEditEvent, UnsolicitedNotificationEvent]