1

私は正方形(パネルのグリッド)を含むゲームを作成しています。ゲームが終了すると、ユーザーが正方形の色がゆっくりと変化するのを見る「ライブ」方式でパネルの色を1つずつ変更するアルゴリズムがあります。私は次のようなことを試みます:

Thread.sleep(1000);      

grid.getComponent(boxNumber).setBackground(Color.YELLOW);

Thread.sleep(1000); 

grid.getComponent(boxNumber).setBackground(Color.ORANGE);

ボックスの色は黄色に変わりますが、その後はオレンジに変わりません。誰かアイデアはありますか?私が明確にできたことを願っています。

4

3 に答える 3

2

並行性に関するSwingチュートリアルのセクションを読んで、sleep()メソッドを使用すべきでない理由を理解してください。

1つの解決策は、SwingWorkerを使用することです。次に、コンポーネントの色を「公開」して、EDTで適切に更新できるようにし、ワーカーでsleep()メソッドを呼び出すこともできます。

于 2011-12-29T16:38:09.210 に答える
1

これらはSwingイベントスレッドで発生する必要があります。次の方法でセットバックグラウンドを呼び出します。

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    grid.getComponent(boxNumber).setBackground(Color.ORANGE);
  }
});

イベントスレッドに参加しないでください(またはSwingイベントリスナー(ActionListener、WindowListenerなど)内から直接参加しないでください)Thread.sleep()

また、このようなものに特化したSwingTimingFrameworkを検討することも賢明です。

于 2011-12-29T16:30:06.883 に答える
1

Thread.sleep(1000);-一般的に、EDTで行うのは良い考えではありません。タイマーを使用してみてください。
-後で電話する必要もありますrevalidate()/validate() and repaint()

だから多分このようなもの:

Timer yellowTimer = new Timer(1000,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
             jtp.setBackground(Color.YELLOW);
            //call revalidate()/validate() and repaint() afterward
             jtp.revalidate();
             jtp.repaint();
        }
    });
yellowTimer.setRepeats(false);

Timer orangeTimer = new Timer(2000,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
             jtp.setBackground(Color.ORANGE);
             //call revalidate()/validate() and repaint() afterward
             jtp.revalidate();
             jtp.repaint();
        }
    });
orangeTimer.setRepeats(false);

yellowTimer.start();
orangeTimer.start();
于 2011-12-29T16:41:57.433 に答える