• ベストアンサー
※ 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

  • クリップボードからの取得プログラム

    ボタンを押すと、テキストエリアにクリップボードの中身を代入する単純なプログラムです。 しかしコンパイルエラーが出てしまいます(~_~;) getTransferDataFlavor()メソッドがないからアブストラクトにしろ、というエラーです。 あるサイトから拾ったものを組み合わせたのですが、 getTransferDataFlavor()メソッドはつかっておらず、 なぜコンパイルエラーなのかわかりません。 お分かりになる方、ぜひぜひおしえてください<m(__)m> ボタンクリック public void actionPerformed(ActionEvent e) { Clipboard cb = getToolkit().getSystemClipboard(); Transferable st = cb.getContents(this); try{ String ds = (String)st.getTransferData(DataFlavor.stringFlavor); txt.setText(ds); }catch(Exception ex){}

  • 数字を動くプログラムについて

    番組の最後に流れるスタッフロールのように 数字が左から右に動くプログラムを以下のようなかんじで作りました。 class MyDrawPanel extends JPanel{ public void paintComponent(Graphics g){ g.setColor(Color.WHITE); g.fillRect(0,0,this.getWidth(),this.getHeight()); g.setColor(Color.BLACK); g.setFont(font); g.drawString("12345",x,y); } } というコンポーネントを x=-200; for(int i=0;i<500;i++){ x++; drawPanel.repaint(); try{ Thread.sleep(1); }catch(Exception ex){ } }というふうに動かしました。 ふたつ質問があります。 1.異なるスペックのパソコンで実行してみたところ表示(動く)スピードに大きな差が出ました。  これはしょうがないことなのでしょうか?(解決する方法があるのでしょうか?) 2.インクリメントをする際にThread.sleepで1msec休止させていますが   これをもっと短くすることはできないのでしょうか?   動くスピードが遅いのでもう少し速くしたいです。  (xのインクリメントをx+=2でやってみましたがこれくらいしか方法はないのでしょうか?)

    • ベストアンサー
    • Java
  • コンストラクタ内でのイベントの記述

    JFrameを継承したクラスで、フィールドにJButton myjbutton,JText myjtext,JLabel myjlabel などを宣言しています。クラスのコンストラクタで それらを初期化し、ついでに以下の記述を しているのですが、this.myjtextとthis.myjlabelで thisが解決できない、というエラーになります。 thisをはずすと、うまくいくのですが、なぜthisを 描いてはいけないのか分かりません。 教えてください。 myjbutton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ try{ Socket mys=new Socket(this.myjtext.getText(), 5555); this.myjlabel.setText("接続しました。"); mys.close(); }catch(IOException ie){} }});

    • ベストアンサー
    • Java
  • javaの割込みのcatchに関する質問

    下記のコードはgenInterruptにて、割込みを10回発生させ、rcvInterruptでその 割込みをcatchするものです。 割込みの発生周期が1msの場合は、割込みのcatchは略10回受取ることが出来ますが、 割込みの発生周期が短い場合は、最初の2、3個受取るのみです。 Q1)割込みの発生周期が1msの場合には、全ての割込みをcatchすることが出来ますか? //========================== //Project: Interrupt(受信側セット)の確認 class T_thread extends Thread{ static int TIMES=20; public static void main(String args[]){ rcvInterrupt obj=new rcvInterrupt(); obj.start(); for (int i = 0 ; i <TIMES ; i++){ try{ Thread.sleep(1); //System.out.println("main: "+TIMES+"20回の1msタイマー待ち"); }catch(InterruptedException e){ } } } } class genInterrupt extends T_thread{ private Thread target; genInterrupt(Thread targetx){ this.target=targetx; } public void run(){ System.out.println("genInterupt start"); for (int i=0; i<10; i++){ try{ Thread.sleep(0); //割込みが殆ど捕らえられない //Thread.sleep(1); //割込みが全て捕らえられない事がたまにある target.interrupt(); } catch(InterruptedException e){ } } } } class rcvInterrupt extends T_thread{ int cnt=0; public void run(){ genInterrupt obj=new genInterrupt(Thread.currentThread()); obj.setPriority(Thread.MAX_PRIORITY); obj.start(); System.out.println("receiveInterupt start"); for (int i=0 ; i<20 ; i++){ try{ Thread.sleep(2); }catch(InterruptedException e){ System.out.println("get interrupt cnt="+cnt++); } } } } //========================== 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • javaアプレットについて質問です

    本の通りにソースを記入し、コンパイラしました。 その後実行したら Exception in thread"main"java.lang.NoSuchMethodError:main とコマンドプロンプトに表示されました。 何が原因ですか? 因みに下記がソースコードです import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Sample13 extends JApplet { private JLabel lb; private JTextField tf; public void init() { //コンポーネントの作成 lb = new JLabel("お選びください。"); tf = new JTextField(); //コンテナへ追加 add(lb, BorderLayout.NORTH); add(tf, BorderLayout.SOUTH); //リスナの登録 tf.addActionListener(new SampleActionListener()); } //リスナクラス class SampleActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { JTextField tmp = (JTextField) e.getSource(); lb.setText(tmp.getText() + "ですね。"); } } }

  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • カンマ付数字をDBへ追加するにはどうしたらいいですか?

    txt1.setText(15,200) btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try{ // **接続情報** String drv = "org.postgresql.Driver"; String url = "jdbc:postgresql:postgres"; String usr = "postgres"; // **DBへの接続、問合せ** Class.forName(drv); Connection cn = DriverManager.getConnection(url, usr, pw); Statement st = cn.createStatement(); String qry1 = "INSERT INTO getuji (数字) VALUES ( "+ txt1.getText() + ");"; st.executeUpdate( qry1 ); // **DB切断** st.close(); cn.close(); } catch(Exception f){f.printStackTrace();} } }); txt1にカンマの付いている数字を入れるとエラーが出てしまいます。 カンマがなければエラーが起きないのですが何か良い方法はないでしょうか? DBのgetuji表のテーブル(数字)のデータ型はintegerです。なのですがこれを変えた方がいいのでしょうか? わかる方がいらっしゃいましたらよろしくお願いします。

    • ベストアンサー
    • Java
  • アプレットで・・

    「アプレットでボタンが押されたら、指定したファイルに文字列を書きだす」 というものを作ってるのですが、書き出されません・・。 内容は・・・ public class Kaku extends Applet implements ActionListener{ String file ="c:\\kaku\\goo.txt"; Button but; public void init() { but = new Button("書き出す"); but.addActionListener(this); add(but); } public void actionPerformed(ActionEvent event) { // but.setLabel("結果"); try{ FileWriter fw = new FileWriter(new File(file)); fw.write("GOO"); fw.close(); }catch(IOException e){ ex.printStackTrace(); } } } FileWriter 単体でプログラムを組むと、うまく書き出されるのですが、アプレットになるとダメです・・。 何か考え間違いをしているのでしょうか? 助言、よろしくお願いします。

    • ベストアンサー
    • Java
  • 画像がうまく表示されない。

    アプレットを作っています。 左クリックすると、次の画像へ進む、といった処理を実装したのですが、1回は次の画像へ進むのですが、2回目以降が進みません(しかも、「1.jpg」から「2.jpg」へ進めたいのですが、何故か「1.jpg」から「10.jpg」にいってしまいます。)以下が現在のコードです。 余分な部分は削除しました。よろしくお願いします。 public class Main extends Applet implements MouseListener, Runnable{ Image nowImage, nextImage; static int i; MediaTracker mt = new MediaTracker(this); MediaTracker mt2 = new MediaTracker(this); int yousosu,w,h; Thread thread; static float alpha; static boolean runflag = true; static boolean flag = true; static int j = 1; Image buf; Graphics ct; int sleeptime = 300; Image img; Vector imgs = new Vector(); public void init(){ i = 0; thread = new Thread(this); yousosu = Integer.parseInt(getParameter("NumImage"));//配列(画像)の要素数 for(int t = 0; t < yousosu; t++){ img = getImage(getDocumentBase(),"imagesyukusyo/" + t+1 + ".JPG"); imgs.addElement(img); img = null; } int kazu = imgs.size(); addMouseListener(this); w = getSize().width; h = getSize().height; buf = createImage(w,h);//バッファ取得 //*******最初の画像のロード******* nowImage = getImage(getDocumentBase(), "imagesyukusyo/1.JPG");//←Vectorの[0]要素? } public void update(Graphics g){ paint(g); } public void paint(Graphics g){//drawImageファイルを表示するだけ ct = buf.getGraphics(); Graphics2D ct2 = (Graphics2D) ct; Graphics2D g2 = (Graphics2D) g;//Grahics2Dクラス AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); mt.addImage(nowImage,0); mt2.addImage(nextImage, 0); try { mt.waitForID(0); mt2.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); } ct2.drawImage(nowImage,0,0,w,h,this); ct2.setComposite(composite); //次からはcompositeを設定した後の描画になる。 ct2.drawImage(nextImage,0,0,w,h,this); g2.drawImage(buf,0,0,w,h,this); } //*********マウスイベント************ public void mouseClicked(MouseEvent e) { int btn = e.getButton(); //*******左クリック********** if(btn == MouseEvent.BUTTON1){//左クリック=進め System.out.println("左クリック"); System.out.println("iは"+i); System.out.println("elementAtの数は"+imgs.size()); if(i >= yousosu){//要素数より多くなったら… i = 0; } nowImage = (Image)imgs.elementAt(i); if(i == yousosu-1){ nextImage = (Image) imgs.elementAt(0); }else{ //通常こっち nextImage = (Image) imgs.elementAt(i+1); } thread = new Thread(this); thread.start(); thread = null; i++; } } public void run(){ alpha = 0.2f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.3f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.4f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.5f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.6f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.7f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.8f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.9f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 1f; repaint(); } }

    • ベストアンサー
    • Java
  • スレッド動かず

    本の真似をして、スレッドを書いてみたんですがに何も起こりませんでした。全く分かりません。どうすれば良いでしょうか? public class Frame1 extends Frame implements Runable{ ................. ................. Thread kick = new Thread(this); int time; public void start() { if (kick ==null) kick.start(); } public void run() { while (kick == Thread.currentThread()) { time++; String s = Integer.toString(time); textArea1.append( s + "\r\n"); try{ Thread.sleep(1000); }catch(InterruptedException e){} } }

    • ベストアンサー
    • Java