【问题标题】:AWT EventQqueue AccessControlExceptionAWT 事件队列访问控制异常
【发布时间】:2011-09-15 18:57:43
【问题描述】:

我正在通过系统事件队列推送我自己的测试事件队列。在 TestEQueue 中,我通过一次调用 super.dispatchEvent 来重载 dispatchEvent 方法

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

但由于某种原因,在新的 TestQueue 中调度失败并出现 AccessControlException。在没有 TestEQueue 的情况下,在主程序中成功调度了相同的事件。

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

【问题讨论】:

  • api 文档用于从 getSystemEventQueue() 读取 :-):如果安全管理器存在并且其 java.lang.SecurityManager.checkAwtEventQueueAccess 方法拒绝访问 EventQueue,则抛出
  • 本次调用无异常成功

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


【解决方案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() {
    }
}

【讨论】:

  • 在我的情况下,我没有从主线程触发任何 UI 处理,我正在添加一个新菜单和模拟菜单键按下和释放。我担心是否因为处理的此操作而触发事件新队列的 EDT 的权限低于原始 EDT
  • 我已经测试了打印主调度线程的访问权限和我的测试事件队列 EDT 权限。它们不同。为什么它们不同,它们属于同一个线程组
  • @siri 不知道,你能用相关代码编辑你的帖子吗:-),也许会很有趣
  • 我是错误的原始 EDT 和 TestEQueue 的权限是相同的......但仍然 checkPermission 调用失败
  • 我(仍然)确保你不能多玩 EventQueue,一个来自 Swing 包的 EDT 队列,只替换/清除/添加/等待一个线程,不确定但来自 Java5不可能以某种方式使用单个 Swing 线程,有很多承诺在 Java7 中将实现多队列,:-) 在 Java7_010 -15upd 之前我无法对此感兴趣,那么 Java7 对我来说将是稳定和有趣的, :-)
【解决方案2】:

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

【讨论】:

  • 是的,你是对的,但我怀疑从这个新队列的事件调度线程调度的事件是否与原始队列的 EDT 具有不同的访问权限。
  • 对不起,我无法重现你描述的效果。
  • 我认为这是不可能的,@trashgod 感谢最终结果,我的脑袋空空,+1
  • @trashgod 我检查了它们的权限是否相同.. 但仍然只从新推送的队列中抛出 AccessControlException... 我不是要调试这个原因吗?有什么帮助吗?
  • 你可以在你的代码中寻找Methods in java.security that throw AccessControlException被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多