興味深い主題。私はEventQueueのコードにビットを調査してきた、と私はあなたの問題を解決していないが、私はいくつかの有用なポインタを持っていることがあります。
- あなたが引き継ぐない限り、サイズの変数を保持していないのEventQueueのOracleの実装EventQueue(3を参照)を完全に制御すると、OracleのJREを使用する場合、キューのリニアスキャンよりも優れた方法はありません。
- 独自のEventQueueを作成することもできます(おそらく、Oracleの実装にコピーを加え、いくつかの調整**が最も簡単になります)。
EventQueue.push(EventQueue)
を使用して独自の実装をインストールします。キュー内のすべてのイベントはキューに転送されるため、キューに登録されたイベントを数えることができます。残念ながら、これはまだリニアスキャンですが、少なくともプラットフォームに依存しません。
- また、元のイベントキューが作成された後、できるだけ早く独自のEventQueue実装(2を参照)をインストールすることができます(メインメソッドを含むクラスの先頭にある静的コードブロックで行います)。それで、あなたの実装は、投稿されたすべてのイベントをカウントすることができ、サイズを知りたいときにキューをスキャンする必要はありません。 (誰も私はこれを試していないが、私はすべての公開/保護された静的コードを除去します:
**いくつかの調整)は、あなただけの他の誰もあなたの上に自分自身のEventQueueをプッシュしていない願っていますする必要がありますそれらのメソッド/変数を参照すると、java.awt.EventQueueが使用されます)、サイズ変数を追加し、この変数をpostEvent(AWTEvent, int)
,getNextEventPrivate()
,getNextEvent(int)
およびremoveSourceEvent(Object, boolean)
の4つのメソッドで更新します。
この変更で大きな問題がEventQueueのは、あなたの実装が異なるパッケージになりますので、あなたが呼び出すことが許可されていないデフォルトの可視性とAWTの方法にはいくつかの呼び出し(例えば、Toolkit.getEventQueue()
とComponent.getAccessControlContext()
)を、作るという事実であります。それぞれのケースごとに個別に回避策を見つける必要があります。
探索するには、[ここ](http://stackoverflow.com/q/3158254/230513)に示すように、イベントを傍受することができます。 – trashgod
Ten _million_! 'setCoalesce(false)'? – trashgod
既にそれを考えてスキャンしました。合体ロジックをオフにしません。 –