为了调试 Swing 应用程序中的奇怪行为,我想用我自己的实现替换 AWT EventQueue。
这可能吗?如何?
以防万一您感兴趣:
该实现将是普通事件队列的简单包装器,进行一些日志记录。
我想调试的问题是 TableCellEditor,它在一个小演示应用程序中运行良好,但是当放入真正的应用程序时,由于某些事件,stopCellEditing 会立即被调用。我想访问该事件以了解它的来源。
为了调试 Swing 应用程序中的奇怪行为,我想用我自己的实现替换 AWT EventQueue。
这可能吗?如何?
以防万一您感兴趣:
该实现将是普通事件队列的简单包装器,进行一些日志记录。
我想调试的问题是 TableCellEditor,它在一个小演示应用程序中运行良好,但是当放入真正的应用程序时,由于某些事件,stopCellEditing 会立即被调用。我想访问该事件以了解它的来源。
EventQueue 有一个名为 push() 的方法,可以完全按照您的意愿进行操作。这是一个小演示:
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 发布的解决方案非常适合 java 1.6,但会导致 Swing 应用程序永远不会在 java 1.7 中退出。在 JDK 1.7 下,您必须在 Event Dispatch 线程中安装新的 EvenQueue ...并在 JDK 1.6 的外部安装...编写一次,到处运行 ;-)
这是一个通用的解决方案……希望 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 将为您提供所有 AWTEvents 的句柄。
您将如何处理所有事件。事件列表如下。
[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]