如何用自己的实现替换AWT EventQueue

时间:2010-07-01 13:31:51

标签: java swing eventqueue

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

这可能吗?怎么样?

万一你感兴趣:

  • 实现将是一个围绕正常Eventqueue的简单包装器,进行一些日志记录。

  • 我想要调试的问题是一个TableCellEditor,它可以在一个小的演示应用程序中正常工作,但是当放入真正的应用程序时,由于某些事件,会立即调用stopCellEditing。我希望能够访问该活动,以便了解它的来源。

3 个答案:

答案 0 :(得分:24)

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);
        }
    }
}

答案 1 :(得分:15)

对java 1.7要谨慎。那是bug。由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);
        }
    }
}

答案 2 :(得分: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]