0

パネルを青く塗って、5秒待ってから他のことをしたいです。
これで、次のコードができました。これは、自分がやりたいことを実行することを期待しています。ここにあります:

JPanel somePanel = getSomePanel();
somePanel.setBackground(Color.BLUE);
Object lock = new Object();
synchronized (lock) {
    try {
        lock.wait(5000);
    }
    catch (InterruptedException exc) { }
}
// Do other stuff

ただし、代わりに、5秒間待機してから、コンポーネントを青色でペイントします。

  • なぜ最初に待ってから青く塗るのか、その逆ではないのですか?(Swingメカニズムと関係があると思います...?)
  • 「その順序を変更する」方法は?
4

3 に答える 3

4

GUI イベント ハンドラーで待機しないでください。メッセージの処理が妨げられます。リクエストを再描画します。

ロックを待っている間、GUI は何も実行されません。

于 2013-01-30T12:27:46.360 に答える
4

Swing 自体をロックして GUI をフリーズするだけなので、Swing イベント スレッドをロックして同期コードを実行しないでください。詳細については、Google の「Concurrency in Swing」を参照してください。私自身、これには Swing Timer を使用します。投稿ではタグを使用していますが、実際にはどこでもマルチスレッドを行っていないことに注意してください。

于 2013-01-30T12:28:30.123 に答える
3

他の人は正しいです、あなたがイベントディスパッチスレッドを待っているなら、このスレッドはその間何のペイントもしません。

ただし、新しいスレッドを開始せずに役立つはずのトリックがあります。背景色を設定した直後にpaintを呼び出します。

somePanel.paintImmediately(0, 0, somePanel.getWidth(), somePanel.getHeight());
于 2013-01-30T12:47:45.747 に答える