interfaz - java swing tutorial pdf español
Cómo reemplazar AWT EventQueue con implementación propia (3)
Esto esta bien. La ampliación de EventQueue le dará un control sobre todos los AWTEvents.
¿Cómo manejarán todos los eventos? La lista de eventos es la siguiente.
[AWTEvent, BeanContextEvent, CaretEvent, ChangeEvent, ConnectionEvent, DragGestureEvent, DragSourceEvent, DropTargetEvent, FlavorEvent, HandshakeCompletedEvent, HyperlinkEvent, LineEvent, ListDataEvent, ListSelectionEvent, MenuEvent, NamingEvent, NamingExceptionEvent, NodeChangeEvent, Notification, PopupMenuEvent, PreferenceChangeEvent, PrintEvent, PropertyChangeEvent, RowSetEvent, RowSorterEvent , SSLSessionBindingEvent, StatementEvent, TableColumnModelEvent, TableModelEvent, TreeExpansionEvent, TreeModelEvent, TreeSelectionEvent, UndoableEditEvent, UnsolicitedNotificationEvent]
Para depurar comportamientos extraños en una aplicación Swing, me gustaría reemplazar el AWT EventQueue con mi propia implementación.
es posible? ¿Cómo?
En caso de que estés interesado:
la implementación será una envoltura simple alrededor de la secuencia de eventos normal, haciendo algo de registro.
El problema que me gustaría depurar es un TableCellEditor, que funciona bien en una pequeña aplicación de demostración, pero cuando se coloca en la aplicación real, se llama a stopCellEditing inmediatamente, debido a algún evento. Me gustaría tener acceso al evento para averiguar de dónde viene.
EventQueue tiene un método llamado push () que hará exactamente lo que usted desea. Aquí hay una pequeña demostración:
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);
}
}
}
Tenga cuidado con Java 1.7. Hay un bug . La solución publicada por rancidfishbreath es perfecta con Java 1.6 pero da como resultado una aplicación Swing que nunca sale con Java 1.7. En JDK 1.7, debe instalar el nuevo EvenQueue en el hilo de Despacho de evento ... y fuera de él en JDK 1.6 ... Escribir una vez, ejecutar en todas partes ;-)
Aquí hay una solución universal ... espero, 1.8 no lo cambiará ;-)
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);
}
}
}