AWT EventQqueue AccessControlException

Я помещаю свою собственную очередь тестовых событий в очередь системных событий. И в TestEQueue я перегрузил метод dispatchEvent одним вызовом super.dispatchEvent

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

Но по какой-то причине диспетчеризация в новом TestQueue завершается с AccessControlException. Куда же событие успешно отправлено в основной программе без TestEQueue.

Как это возможно, поскольку обе очереди будут работать в одной и той же группе потоков? Как я могу отладить эту проблему? Это часть очень большой тестовой базы кода, поэтому я не могу скопировать функциональный код. Это может быть связано с менеджером безопасности?

2 ответа

Обратите внимание, что push() заменяет существующий EventQueue; это не добавляет новую очередь. Я думаю, что предпосылка вашего вопроса может быть неверной. Смотрите также этот Q & A.

Никто не знает, как ты построил свой own test event queue over the System eventqueueможет ты там скучаешь invokeAndWait,

полезная информация и здесь

просто мое любопытство, если ваш тест заканчивается успешно, пожалуйста, проверьте это с 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() {
    }
}
Другие вопросы по тегам