• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:数字を一瞬だけ表示(似たような質問すみません))

数字を一瞬だけ表示

このQ&Aのポイント
  • 数字を一瞬だけ表示する方法を教えてください
  • ボタンを押すと一瞬だけ数字が表示されるようにしたいです
  • JLabelを使用して数字の表示を制御する方法を教えてください

質問者が選んだベストアンサー

  • ベストアンサー
noname#49664
noname#49664
回答No.1

これは、先の質問とは根本的に違う話になるのですね実は。ですからわからないのも無理はありません。  表示が途中で更新されない理由は、Swingを使っているからです。使っているコンポーネントをAWTにして同じことをしてみましょう。今度は問題なく表示されるはずですよ。 Swingのコンポーネントの表示は、オフスクリーンバッファリングを使って行っています。これは見えない描画用バッファです。表示を変更するような必要が生じると、まずこのオフスクリーンバッファに変更した状態を描画し、すべて表示が完成したところでJFrameに転送され表示されます。  重要なのは、「すべて終わってから表示される」ということです。それはつまり、コンポーネント類の操作などを行うスレッドの処理が終わってから、ということになります。  ちょっと面倒な話になりますが、通常コンポーネント類の描画などの処理は、メインスレッドからAWT-EventQueueと呼ばれるAWTEventキューによる処理を実行するためのスレッドにより実行されます。このスレッドが終了する際にSwingのコンポーネントの表示は更新されるわけです。  質問者さんが作成したソースでは、単にactionPerformedから変更をしています。つまり、メインスレッドからAWT-EventQueueによる一連のコンポーネント処理のスレッド内で行っているわけです。このため、このスレッドが終了する際にまとめて表示が更新され、途中で変更されなかったのです。  従って、もっともわかりやすい解決策は、(AWTに変更するという方法を除くと)別スレッドを使ってこの処理を実行するという方法でしょう。 public void actionPerformed(ActionEvent ev){ new Thread(this).start(); } public void run(){ numlabel.setText("123"); try{ Thread.sleep(Msec); }catch(InterruptedException ex){ ex.printStackTrace(); } numlabel.setText(" "); } 例えば、そのクラスをimplements Runnableにしておき、このような形で新たにスレッドを作成してそこで実行すれば、表示は更新されるはずですよ。

ebinamori
質問者

お礼

御礼が遅くなり申し訳ありませんでした。 またも回答本当にありがとうございます。 ひとつ質問なのですがBorderLayoutのCENTERでnumlabelを パネルに配置しているにもかかわらず 数字が右寄りに表示されてしまいます 何かいい方法はないのでしょうか?

ebinamori
質問者

補足

GridBagLayoutを使ったらうまくいきました。 本当にたびたびありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A