如何将 AWT 事件队列替换为自己的实现 [已关闭]

2022-09-01 22:50:14

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

这可能吗?如何?

以防万一您感兴趣:

  • 实现将是一个简单的包装器,围绕正常的事件队列,做一些日志记录。

  • 我想调试的问题是TableCellEditor,它在一个小的演示应用程序中工作正常,但是当放入实际应用程序时,由于某些事件,stopCellEditing会立即被调用。我想访问该活动,以便了解它来自哪里。


答案 1

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

答案 2

谨慎使用 java 1.7。有一个错误。rancidfishbreath发布的解决方案在java 1.6中是完美的,但导致Swing应用程序永远不会退出java 1.7。在JDK 1.7下,您必须在事件调度线程中安装新的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);
        }
    }
}

推荐