AWT EventQueue AccessControlException

时间:2011-09-15 18:57:43

标签: java swing event-dispatch-thread event-dispatching awt-eventqueue

我在System eventqueue上推送自己的测试事件队列。在TestEQueue中,我通过一次调用super.dispatchEvent重载了dispatchEvent方法

      TestEQueue mytestqueue = new TestEQueue();
      Toolkit.getDefaultToolkit().getSystemEventQueue().push(TestEQueue);

但由于某些原因,新的TestQueue中的调度因AccessControlException而失败。在没有TestEQueue的情况下在主程序中成功调度相同事件的位置。

如果这两个队列都在同一个线程组中运行,那怎么可能呢?我该如何调试此问题?这是一个非常大的测试代码库的一部分,所以我无法复制功能代码。这可能与安全经理有关吗?

2 个答案:

答案 0 :(得分:1)

没有人知道你是如何构建自己的own test event queue over the System eventqueue的,也许你错过了invokeAndWait

有用的infoshere

只是我的好奇心,如果你的测试成功结束,那么请用SwingUtilities.invokeAndWait测试,如果有一些差异(等待什么),我标记你的线程通知任何变化: - )

此代码应该用于测试目的,

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 {
        EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
        eventQueue.push(new MyEventQueue());

        EventQueue.invokeAndWait(new Runnable() {

            @Override
            public void run() {
                System.out.println("Run");
            }
        });
    }

    private static class MyEventQueue extends EventQueue {

        @Override
        public void postEvent(AWTEvent theEvent) {
            System.out.println("Event Posted");
            super.postEvent(theEvent);
        }
    }

    private QueueTest() {
    }
}

答案 1 :(得分:1)

请注意push() 替换现有的EventQueue;它不会添加新队列。我认为你的问题的前提可能是错误的。另请参阅此Q&A