この記事があります:
誰かが列を飛び越えました!ときどき、いくつかのスイング イベントがイベント キューで間違った順序で処理されているように見えます (そして、誰かがキューに割り込むときのように私の血が沸騰することはありません) 奇妙な動作を引き起こします。これは、小さなコード スニペットで最もよく示されています。以下のスニペットを読んで、イベントがどのような順序で起こると想像するかを注意深く考えてください。
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
repaint();
doSomething();
}
});
ほとんどの開発者は、repaint() メソッドが doSomething() メソッド呼び出しの前に描画操作を行う結果になると想像するでしょう。ただし、実際にはそうではありません。repaint() を呼び出すと、イベント キューの最後に追加される新しいペイント イベントが作成されます。この新しいペイント イベントは、現在のアクション イベントが完了した後にのみ処理 (ディスパッチ) されます。これは、キュー上の新しいペイント イベントがディスパッチされる前に、doSomething() メソッドが実行されることを意味します。
ここで重要な点は、repaint() を呼び出すと新しいペイント イベントが作成され、それが最後のイベント キューに追加され、すぐには処理されないということです。これは、キューをジャンプするイベントがないことを意味します (そして、私の血液は正しい温度を保つことができます)。
私の質問は、どうすれば Swing にrepaint();
BEFOREを実行させることができdoSomething();
ますか?
repaint()
また、メソッド WITHINへの呼び出しがあった場合、それらは完了doSomething();
後にのみ実行されます。途中でexecutindoSomething();
を一時停止してから、を投入し、それを完了してから再開する方法はありますか?doSomething();
reapaint();
doSomething();
これまでに見つけた唯一の解決策はthis(link)ですが、実際には実用的ではありません...