如何用自己的实现replaceAWT EventQueue
为了debuggingSwing应用程序中的奇怪行为,我想用我自己的实现来replaceAWT EventQueue。
这可能吗? 怎么样?
以防万一你有兴趣:
-
该实现将是一个简单的包装正常的Eventqueue,做一些日志logging。
-
我想debugging的问题是一个TableCellEditor,它在一个小小的演示应用程序中工作正常,但是当放在真正的应用程序中,由于某些事件,stopCellEditing被立即调用。 我想访问该事件,以找出它来自哪里。
EventQueue有一个名为push()的方法,可以完成你想要的function。 这是一个小小的演示:
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); } } }
谨慎使用java 1.7。 有一个错误 。 由rancidfishbreath发布的解决scheme在Java 1.6中是完美的,但是导致了一个从不会用java 1.7退出的Swing应用程序。 在JDK 1.7下,您必须在Event Dispatch线程中安装新的EvenQueue …并且在JDK 1.6以外的版本中安装新的EvenQueue …写入一次,到处运行;-)
这是一个通用的解决scheme…希望,1.8不会改变它;-)
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); } } }
这可以。 扩展EventQueue会给你所有AWTEvent的句柄。
你将如何处理所有的事件。 事件列表如下。
[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]