23

为了调试 Swing 应用程序中的奇怪行为,我想用我自己的实现替换 AWT EventQueue。

这可能吗?如何?

以防万一您感兴趣:

  • 该实现将是普通事件队列的简单包装器,进行一些日志记录。

  • 我想调试的问题是 TableCellEditor,它在一个小演示应用程序中运行良好,但是当放入真正的应用程序时,由于某些事件,stopCellEditing 会立即被调用。我想访问该事件以了解它的来源。

4

3 回答 3

25

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);
        }
    }
}
于 2010-07-01T13:50:43.287 回答
16

谨慎使用 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);
        }
    }
}
于 2012-01-22T22:53:13.070 回答
1

这可以。扩展 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]

于 2014-10-29T13:01:36.850 回答