1

システム イベント キューを介して独自のテスト イベント キューをプッシュしています。そして、TestEQueue では、super.dispatchEvent を 1 回呼び出して、dispatchEvent メソッドをオーバーロードしました。

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

しかし、何らかの理由で、新しい TestQueue でのディスパッチが AccessControlException で失敗します。TestEQueue を使用せずにメイン プログラムで同じイベントが正常にディスパッチされる場合。

両方のキューが同じスレッド グループで実行されるため、これはどのように可能になるのでしょうか? この問題をデバッグするにはどうすればよいですか? これは非常に大規模なテスト コードベースの一部であるため、機能コードをコピーすることはできません。これはセキュリティマネージャーに関連していますか?

4

2 に答える 2

1

どうやって を 構築 し た の か 誰 もわから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() {
    }
}
于 2011-09-15T19:29:04.823 に答える
1

既存の;を置き換えることに注意してください。新しいキューは追加されません。ご質問の前提が間違っている可能性があると思います。このQ&Aも参照してください。push() EventQueue

于 2011-09-15T23:34:16.557 に答える