• ベストアンサー

repaintがpaintを実行してくれません。

repaint()をおこなっても、paintが実行される場合とされない場合があります。 なぜですか? repaint()で、paintメソッドに指定した描画を必ず実行させたいのですが、 どうしたら良いのでしょうか?

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

たぶん,できません. Javaの仕様です. >(システム上で実行されているほかのプログラムのため, > あるいは,その他の理由により)システムの実行に余裕がなくなってくると, 呼び出されないそうです. 参考: ローラ・リメイ+チャールズ・L・パーキンズ=著 「Java言語入門--アプレット,AWT,先進的機構」 (株)プレンティスホール出版 p.226

pikodon
質問者

お礼

そうなんですか。。。 repaint()を呼ばなくても、描画画面をマウスでクリックすると、 paintが実行されたり、なかなか扱いが難しいです。 しかし、どうにかしなくては。。。

その他の回答 (1)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

回答を締め切られないようですが, なぜ, > repaint()で、paintメソッドに指定した描画を必ず実行させたい と思われているのでしょうか. ここを具体的に書けば, repaint() を呼ばなくても実現する方法について, 回答がいただけるかもしれませんよ.

関連するQ&A

  • paintメソッドについて

    repaintメソッドはpaintをすぐに呼び出すのではなく、イベントが終了するまで再描画されないと聞きました。そこで、イベント中でもpaintを即座に呼び出せるメソッドはないでしょうか? どなたかご回答お願いします。

    • ベストアンサー
    • Java
  • repaint処理が実行されなくなる時があります

    下記のように1秒周期で描画更新するように していますが、repaint処理が実行されなくなる ことがあります。repaintからupdateが呼び出されて いないことまでは判ったのですが、このような ことがあるのでしょうか?また、回避策があれば 教えて下さい。 ------------------------------------------------ public void run() { try { while ( m_bLoopFlag ) { repaint(); Thread.sleep( 1000 ); } } catch( Exception e ) { } finally { m_bEndFlag = true; } } public void update( Graphics g ) { paint( g ); }

    • ベストアンサー
    • Java
  • 勝手にアプレットが停止します

    アプレットが動作不良となる時があます。 アプレットの定周期(1秒、2秒など)の 更新描画にて、repaint()メソッドを呼び出していますが、 Javaからupdate()メソッドが呼び出されず、画面の 描画処理が行われていない状態となっていようです。 調べたところ、アプレットのrepaint()メソッド を呼び出すと、Javaからupdate()メソッドが 実行され、paint()メソッドに記述している 各描画処理が行われるはずですが、下記のように 実行されていないようです。 非常に困っていますので、どなたかご教授お願いします。    repaint()     ↓    update()  ←なぜかJavaから実行要求が来ない     ↓    paint()

    • ベストアンサー
    • Java
  • repaint()が実行されません。

    repaint()が実行されません。 もともとあるJEditorPane上に画像表示させるために、他のクラスからrepaint()をよびだしてpaint()を実行させようとしているのですが、実行されません……。 以下にプログラムを表示します。 import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Open extends JFrame {   public Open(){   }    public void paint(Graphics g){    System.out.println("paint開始");    Graphics2D g2 = (Graphics2D)g;    BufferedImage readImage = null;    try {    readImage = ImageIO.read(new File("sample.png"));    } catch (Exception e) {    e.printStackTrace();    readImage = null;    }      if (readImage != null){    g2.drawImage(readImage, 0, 0, this);    }    }    public void Fileload(){    System.out.println("再描写");    repaint();   } } 外部のクラスからFileload()を呼び出して実行すると"再描写"はコマンドプロンプト上に表示されるのですが"paint開始"は表示されません。なのでpaint()の呼び出しができていないのだと思うのですが……。 原因がわかりません……。 javaも質問も初心者なのでわかりづらいところがあるとは思いますが、どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • Swingで別のクラスのrepaintをしたい

    paintメソッドが別のクラスにあるときにrepaint();をしたいのですが、やり方がわかりません。 教えてください。

    • ベストアンサー
    • Java
  • 描画した線や画像などを消す方法。

    アプレットを勉強している初心者です。 イベントであるボタンを押すと、ある数字が描画される、というものを作ったのですがそれを消す方法で悩んでいます。白い正方形で塗りつぶすのかな、と思ったのですが、手元の入門書のコードだとpaintメソッドの中で if(flag != 0){g.drawImage(myImg,0,0,this); と書くだけでそれを実装できているみたいなんです。「画像が出るボタン」を押すとフラグを1にしてrepaint()メソッドでpaintメソッドを呼び出して(?repaintメソッドの説明があまりなくてrepaintメソッドの効果がいまいちよく分かりません)画像を描画して、「消すボタン」を押すとフラグを0にしてrepaint()メソッドを実行してpaintメソッドを呼び出して(?)フラグが0なので結果何もしない。という流れです。 私の感覚だと消すボタンを押してもpaintメソッド内で何もしないなら画像が出たまんまなんじゃないか?と思っているのですが、ちゃんと画像は消えます。 (本当はコードを全部載せられれば一番いいのでしょうが、本に掲載されているコードなのでムリだと思うので載せません) どういうことが起こっているのでしょうか?また一度描画されたものを消す方法はどういう方法があるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • paint()メソッドが呼ばれない

     swingを使って多角形を表示するプログラムを作成しています.polygonクラスを配列に格納して,順番に表示しているのですが,配列中のひとつのpolygonオブジェクトを削除して,再描画を行おうとして,repaint()で一旦画面をクリアして,その後my_paint()で配列中のpolygonを描画させようとしているのですが,    ・  repaint();  my_paint();    ・ my_paint()メソッが呼ばれずに画面がクリアされた状態になってしまいます. どなたか,解決方法をご存知でしたら,ヒントでもいただけるとありがたいです.よろしくお願いします.

    • ベストアンサー
    • Java
  • 内部クラスからはrepaint()は実行できない?

    アプレットを勉強している初心者です。 思うような実行が出来ず public class applet extends Applet{ public void init(){} public void paint(){} class buhin extends Button implements ActionListener{ public buhin(){} public void actionPerformed(ActionEvent e){ repaint();//←これ } } } 大雑把ですがこのような構造で、上の場所からはrepaint()は実行できないのでしょうか?動作からはどうやら出来てないようなのですが、いまいち勘なので・・・。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaアプレット repaintのタイミング

    勉強を始めたばかりなので稚拙な質問ですがお許しください。 ユーザーからの入力→repaint→画面に反映→プログラムが処理→repaint→画面に反映 というターン制のような動かし方をしたいのですが、実際にはユーザーの入力の後、プログラムの処理を待ってからまとめてrepaintしてしまいます。 repaint()は再描画を要求しているだけに過ぎず、repaint()と書いた場所で即時に再描画されるわけではないそうですが、では具体的にすぐ再描画してほしい場合はどうすればいいのでしょうか? 例えばですが、「ボタンを押すとcountの値が+1され、四角がcount個描画される。その一秒後に、こちらが何もしなくてもcountが+2されてもう一度四角がcount個(つまりこの時点で合計三個)描画される」というのを作ってみました。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class question extends Applet implements ActionListener{ Button bt1; int count = 0; public void init(){ bt1 = new Button("start"); add(bt1); bt1.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { bt1.setEnabled(false); count += 1; repaint(); try { Thread.sleep(1000); } catch (InterruptedException e1) { } count += 2; repaint(); bt1.setEnabled(true); } } public void paint(Graphics g){ for(int i = 0; i < count; i++){ g.drawRect(10, 10, 10 + i * 5, 10 + i * 5); } } } これではボタンを押すたびに3つずつ四角が増えているように外見上見えてしまいます。 ボタンを押すとしっかり1つ四角を表示してから一秒待って、2つ四角を増やす。という風にするためにはどうすればよいのでしょうか? どなたかご教示ください。 ちなみにpaintImmediatelyというものを見つけましたが、何故か使えず……(メソッドpaintImmediatelyは未定義ですと言われてしまう)

    • ベストアンサー
    • Java
  • repaintが実行されません(iアプリ)

    Java初心者なのですが、頑張ってテトリスをiアプリで作ろうと思っています。 何分オブジェクト指向などをあまり理解できていないためソースがいまいち見苦しいかと思いますが、よろしければ手助けしていただけると幸いです。 関係があると思われるメソッドだけを載せます。 以下、ソース----------------------------- public final class Tetris extends Canvas implements Runnable{   /**   (変数などの設定が入ります)   **/   Thread t = new Thread(this);   t.start();   paintFrag = true;   Thread tp = new Thread(this);   GameLoop(); } //ゲームのメインループ public void GameLoop(){   //オープニングの表示   GameStart();   while(true){     //新しくミノを生成     //ゲームオーバーかどうかも同時にチェック     if(CreateMino() == 1){       GameOver();    //ゲームオーバー時のメソッド     }     while(true){       //1000ミリ秒待つ       try{         Thread.sleep(1000);       }       catch(Exception e){       }       //ミノを1つ落下させる       //1つ下に固定済みブロックがあれば1を返す       if(DropMino() == 1){         break;       }     }   } } public void run(){   //30フレームで画面を再描画   if(paintFrag == true){     while(true){       try{         Thread.sleep(33);       }       catch(Exception e){       }       System.out.println("テスト");       repaint();     }   }   //こっちではキー状態を監視   else{     while(true){     (まだ未実装です)     }   } } ソース終わり----------------------------- これで実行した場合、コンソール画面にはきちんと「テスト」とは33ミリ秒毎に表示されるのですが、実際のiアプリの画面には何も表示されずに真っ黒な状態のままです。 GameLoopの「while(true){}」のループを2つとも外した場合、起動してから1000ミリ秒は何も表示されず、1000ミリ秒以上経ってからは1マス落ちた状態のブロックが表示され、それ以後は何も動作がありません。 paintメソッドに「System.out.println("~~");」と記述してもこれはコンソール画面に表示されないので、どうやらGameLoopメソッドがループしている間はpaintメソッド自体が動作していないような感じなのですが、原因がなんなのか検討もつきません。 分かる方いらっしゃいましたらヒントでもいいので回答お願いします。 開発ツールはDoCoMoの公式サイトでダウンロードできるiappliTool for Doja 5.1(FOMA)を、Javaのバージョンは1.4.2_13を使用しています。