質問
Java Swingを使用してゲームを書いています。画面にカスケード効果を作成するために、ループがわずかな遅延で実行されるたびにペイントしたいと思います。システム内の効率性ルーチンは、 repaint()
1回の呼び出しに。とにかく、変更はすべて、総遅延後に一度に発生します。システムにすぐに塗り直してから、ループの各反復を遅らせる方法はありますか?
私のコード:
for(int i=0;i<10;i++){
JButton[i].setBackground(Color.WHITE);
JButton[i].repaint();
Thread.sleep(2000);
JButton[i].setBackground(Color.GRAY);
JButton[i].repaint();
}
解決
使用できます JComponent.paintImmediately
即時の塗り直しを強制する。
編集:質問をもう一度読んだ後、イベントディスパッチスレッドでロジックを実行している可能性があります。これは、メソッドが返されるまで塗り直し要求が実行されないことを意味します。あなたがあなたのコードを別のスレッドに入れた場合、それはおそらく問題を修正するでしょう、そしてそれは使用するよりもはるかに良いでしょう paintImmediately
.
void uiFunction() {
new Thread() {
public void run() {
for(int i = 0; i < 10; i++) {
final JButton b = buttons[i];
SwingUtilities.invokeLater(new Runnable() {
b.setBackground(Color.WHITE);
b.repaint();
}
Thread.sleep(2000);
SwingUtilities.invokeLater(new Runnable() {
b.setBackground(Color.GRAY);
b.repaint();
}
}
}
}.run();
}
それは少し厄介ですが、うまくいけばどこから始めればいいのかがあなたにアイデアを与えてくれることを願っています。
他のヒント
ここで正しい軌道に乗っているかどうかはわかりませんが、これはスレッドの問題ですか?睡眠は現在のスレッドを眠らせるからです。したがって、塗り直しが現在のスレッド上にある場合、塗り直しを効果的に列に並べ、保持し、別の塗り直しを列に並べます。次に、メソッドが終了し、グラフィックスレッドのイベント処理ループが発射され、2つの塗り直し(崩壊)を実行して、すべてを一度に発生させます。
その考えに基づいて、私はあなたに2つのオプションがあるかもしれないと思います:
メイングラフィックスレッドを停止しないようにコードを2番目のスレッドに置き、それはグラフィックスレッドが睡眠が起こっている範囲で塗り直していることを意味するためです。
あなたが眠る前に(私が思うことを本当にお勧めしません)、イベントループをトリガーして、塗り直しを強制します。私はこれを調べる必要があります。私の頭の上からそれをする方法を覚えていません。 :-)
私はおそらく#1を最良の選択肢として見ているでしょう。