Javaでは、ユーザの操作など(例:マウス入力やキー入力)が発生したとき、AWTイベントディスパッチスレッド上で、GUIコンポーネントを処理(例:描画処理やサイズ変更)し、開発者が実装したイベントリスナを呼び出します。イベントリスナで処理を実装する際、以下の点を考慮してください。
AWTイベントディスパッチスレッド以外のスレッドから直接GUIコンポーネントを操作しない
GUIコンポーネントのほとんどのメソッドは、スレッドセーフではありません。AWTイベントディスパッチスレッド以外のスレッドから直接GUIコンポーネントのメソッドを実行してはいけません。
以下のメソッドを使用することにより、AWTイベントディスパッチスレッド上で非同期的にGUIコンポーネントのメソッドを実行することができます。
java.awt.EventQueueのinvokeLater(java.lang.Runnable)メソッド
java.awt.EventQueueのinvokeAndWait(java.lang.Runnable)メソッド
javax.swing.SwingUtilitiesのinvokeLater(Runnable)メソッド
javax.swing.SwingUtilitiesのinvokeAndWait(Runnable)メソッド
この考慮がされていないと、AWTイベントディスパッチスレッドと別スレッドが同時にGUIコンポーネントにアクセスすることにより、GUIコンポーネントに内部矛盾が発生し、GUIコンポーネントの動作に支障をきたすことがあります。
必ず正常に処理を完了させる
イベントを処理する際には、あらゆる例外をすべてキャッチし、正しく処理し、必ずイベント処理を終わらせるようにする必要があります。
スレッドでキャッチしなかった例外があると、AWTイベントディスパッチスレッドが停止してしまい、イベントを配送できなくなります。
膨大な時間を要する処理は別スレッドで行う
イベントを処理している間にも、ユーザ操作などにより、イベントが次々と発生します。AWTイベントディスパッチスレッド上で、膨大な時間を要する処理を行うと、イベントが溜まり、GUIコンポーネントの動作に支障をきたす場合があります。
このような場合は、別スレッドを起動して、膨大な時間を要する処理を行ってください。
イベントの発生順やそのタイミングに依存しない処理を実装する
イベントの発生順やタイミングは一定ではありません。GUI操作などで発生するイベントは非同期に発生するだけでなく、その発生順にイベントキューに格納されるとも限りません。
また、OSの種類やJDK/JREのバージョンによって、イベントの発生順が前後することがあります。そのため、イベントリスナでは、イベントの配送順に依存しないプログラミングを行ってください。