1

私はいくつかの画像を含むグラフィカルユーザーインターフェイスを持っています。ボタンを押した後、この画像を変更し、グラフィカル ユーザー インターフェイス全体を再描画します。これは非常にうまく機能します。

ここで私が何をしているのかを示すために、小さな視覚化を行います。私は8枚の画像を持っています:

1. 2. 3. 4.
5. 6. 7. 8. 

ボタンを押すと、すべての画像がステップを左に回転します。

2. 3. 4. 8.
1. 5. 6. 7. 

3. 4. 8. 7.
2. 1. 5. 6. 

4. 8. 7. 6.
3. 2. 1. 5. 

わかりました。すでに述べたように、これはうまくいきます!1 つのステップごとにグラフィカル ユーザー インターフェイスを再描画しますが、もちろんこれは非常に高速に行われるため、開始と終了の間のステップが表示されません。あなたはただ起源を見るだけです:

1. 2. 3. 4. 
5. 6. 7. 8. 

そして最後の変身

4. 8. 7. 6. 
3. 2. 1. 5.

しかし、実際には、ユーザーに各ステップを見てもらいたいのです。したがって、各ステップの後に Thread.sleep() を追加するだけでよいと思いましたが、これによりグラフィカルユーザーインターフェイスがフリーズします(イベントディスパッチャースレッドで何かを見つけました)

だから私はこれにすべてを入れようとしました:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        changeGUI();

        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {}
    }
}

しかし、それでは何も変わりません。それはまだ非常に速く進みます。原点と最後の変換を見るだけです。

すべてのスイング コンポーネントの再描画を呼び出すメソッドは、'changeGUI()' と呼ばれます。

では、一定時間後に再描画する機能を実際に実装するにはどうすればよいですか?

  • ちょっと待って
  • 最初の変換
  • ちょっと待って
  • ....
4

3 に答える 3

4

あなたが使いたいのはスイングタイマーです

スイングスレッドでスリープすると、フリーズの問題が発生します。これは、あなたがしていることです。

例:

import javax.swing.Timer;
...
final Timer print = new Timer(1000, new ActionListener(){

        @Override
        public void actionPerformed(final ActionEvent e){
            System.out.println("It's been 1 second!");
        }
});
print.start();
于 2013-08-08T09:18:56.010 に答える