(長文です。すみません。)repaintをコードに書いてもupdateが実行されなくて困ってます。

このQ&Aのポイント
  • マルチスレッドのアプレットを作っていますが、repaintメソッドがキー入力の場合には正常に実行されますが、0.3秒毎に実行されるべき部分が実行されません。何が問題なのでしょうか?
  • この問題を解決するためには、runメソッド内でrepaintを呼び出す部分を修正する必要があります。
  • 具体的には、repaintメソッドを呼び出す前にThread.sleep(300)を実行することで、0.3秒毎にrepaintが実行されるようになります。
回答を見る
  • ベストアンサー

(長文です。すみません。)repaintをコードに書いてもupdateが実行されなくて困ってます。

わざわざ見て下さってありがとうございます! マルチスレッドのアプレットを作っています。全部書くと多すぎるので、およそのものを書きました。 ●●●●プログラム本体開始●●●● public class RPG extends Applet implements Runnable ,KeyListener {    「いくつかのフィールド」  public void init(){    「中略」   RPG hero = new RPG();   Thread heroStep = new Thread(hero);   heroStep.start();   addKeyListener(this);  }  public void run(){   while(true){    try{     Thread.sleep(300);    }    catch(Exception e){}    System.out.println("リペイント直前")    repaint();    System.out.println("リペイント通過");   }  }  public void update(Graphics g){   System.out.println("アップデイト実行");   paint(g);  }  public synchronized void paint(Graphics g){   System.out.println("ペイント実行");    「中略」  }  public void keyPressed( KeyEvent e ){    「中略」   repaint();  }  public void keyTyped(KeyEvent e){}  public void keyReleased(KeyEvent e){} } ●●●●プログラム本体終了●●●● うまく動かなくて困っています。repaintは、キー入力をした時と、0.3秒毎にheroStepから呼び出される事にしたいのです。キー入力の場合は確実に実行されているのですが、0.3秒毎の方は全然実行してくれないのです。 コンソールを見ると、 リペイント直前 リペイント通過 と、毎回「アップデイト実行」「ペイント実行」が出力されないのです。何がいけないのでしょうか? 万が一、大切な部分を省略していたり、不足の部分がございましたら、教えて頂ければ追加で掲載致します。 どうか宜しくお願い致します。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。 >RPG hero = new RPG(); >Thread heroStep = new Thread(hero); >heroStep.start();  まず、思いつくのが、RPGクラスのインスタンスをひとつ余分に作っているのが問題ですね。  これだと、RPGクラスのインスタンスが二つあることになります。  runメソッド内で表示されていないRPGクラスのrepaintを呼んでいることになります。  上記コードは、 Thread heroStep = new Thread(this); heroStep.start();  こう書くべきだと思います。

BO-BO-keshi
質問者

お礼

わざわざご回答下さいましてありがとうございます! 全くPecoPlusさんのおっしゃる通りでした。まだよく分かっていない事が山のようにありそうです。でも、その分、おととい、きのうと、毎日少しずつ新しい知識が増えてる気がします。日々勉強です(笑) 最後になりましたが、早急かつ、たいへん分かりやすいご回答を下さいまして、ほんとうにありがとうございました!

関連するQ&A

  • 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
  • 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
  • java repaint()に関して

    プログラムで以下のpaintComponents内のデバックができません。 理由は一体何なのでしょうか? お願いします。 import java.awt.Graphics; import javax.swing.JPanel; public class MainPanel extends JPanel implements Runnable { Thread th; public MainPanel() { super(); } public void movestart() { th = new Thread(this); th.start(); } public void paintComponent(Graphics g) { System.out.println("このデバックができない"); super.paintComponent(g); } public void run() { while (true) { System.out.println("ここのデバックはできている"); repaint(); try { th.sleep(100); } catch (Exception e) { } } } }

    • ベストアンサー
    • Java
  • javaのrepaint()について

    Java初心者です。 現在、アニメーションで少々つまずいています・・・ソースは以下の通りです。 import java.awt.*; import java.awt.event.*; public class test04 extends Frame implements KeyListener { public int x = 10, y = 10; public static void main(String[] args) { new test04(); } test04() { super("KeyFrameTest"); //フレーム名 setSize(200, 200); //フレームサイズを設定 MyCanvas mc = new MyCanvas(); mc.addKeyListener(this); add(mc); setVisible(true); //フレームを表示 addWindowListener(new Close()); //クローズ処理 } /*** キーが押されているとき ***/ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case 37: //← x--; break; case 38: //↑ y--; break; case 39: //→ x++; break; case 40: //↓ y++; break; } System.out.println("(" + x + "," + y + ")"); } /*** キーが離されたとき ***/ public void keyReleased(KeyEvent e) { } /*** キーが押された瞬間 ***/ public void keyTyped(KeyEvent e) { } /*** キャンバス用クラス ***/ class MyCanvas extends Canvas { /*** 描画ステータス ***/ public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(x, y, 20, 20); repaint(); } /*** ペイント処理 ***/ //勝手に点滅するのを回避するため public void update(Graphics g) { paint(g); } } } /*** クローズクラス ***/ class Close extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } /*** スリープクラス ***/ class Sleep extends Thread { public void Sleep(long milli) { try { Thread.sleep(milli); } catch(Exception e) { } } } ↑のプログラムを実行すると、押したキーに対応する動作はするのですが、 前に描画した残像が残ってしまい、上手くいきません・・・repaint()の位置を変えてみたり したら、今度はボックスが動かなくなってしまい、訳が分からなくなって来ました・・・何故 上手くいかないんでしょうか? 理想的な動作としては、押したキーに対応した動作をし、残像も残らないようにしたいです。 ご回答よろしくお願いします。

    • ベストアンサー
    • 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
  • 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を使用しています。

  • mouseClickedイベントが実行されない

    Eclipse4.3にて、Window Builderを使いプログラミングの勉強をしています ツールバーにメニューを作成し、クリックのイベントを取りたいのですが… File(F) -New(N) -Print(P) -Exit(X) この構造で、Exit(X)のmouseClicked だけが実行されません mousePressed、mouseReleasedは、実行されます コンソールの表示は、以下の通りです File(F) メニューが押されました。 Exit メニューが押されました。 Exit メニューが離されました。 どなたかアドバイスをお願いします JMenuBar menuBar = new JMenuBar(); menuBar.setBounds(0, 0, 442, 21); contentPane.add(menuBar); JMenu mnNewMenu = new JMenu("File(F)"); mnNewMenu.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println("File(F) メニューが押されました。"); } }); mnNewMenu.setMnemonic(KeyEvent.VK_F); menuBar.add(mnNewMenu); JMenuItem mntmNewMenuItem_2 = new JMenuItem("New(N)",KeyEvent.VK_N); mnNewMenu.add(mntmNewMenuItem_2); JMenuItem mntmNewMenuItem_1 = new JMenuItem("Print(P)",KeyEvent.VK_P); mnNewMenu.add(mntmNewMenuItem_1); JMenuItem mntmNewMenuItem = new JMenuItem("Exit(X)",KeyEvent.VK_X); mntmNewMenuItem.addMouseListener (new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println("Exit メニューがクリックされました。"); } @Override public void mousePressed(MouseEvent e) { System.out.println("Exit メニューが押されました。"); } @Override public void mouseReleased(MouseEvent e) { System.out.println("Exit メニューが離されました。"); } }); mnNewMenu.add(mntmNewMenuItem); }

  • 後置インクリメントの挙動が不明で困ってます

     Eclipse 4.7 Java 8でプログラミングをやっています。 いまスレッドのプログラミングをやっているのですが、後置インクリメント の挙動がC言語の時と違っていて戸惑っています。 問題は、変数 idx でこの変数の値が加算されていきません。 条件演算子がある箇所で加算しているのですが、後置インクリメントでも 加算されていくはずですよね? しかしそうなりません。値は0のままです。 なぜそうなるのか分からないので質問しました。 答えられたらよろしくお願いします。 import static java.lang.System.out; import java.applet.Applet; import java.awt.Graphics; public class JavaThread4 extends Applet implements Runnable { // TODO 自動生成されたメソッド・スタブ final String HelloWorld = "Hello World"; volatile int idx; Thread helloThread = null; public void init() { idx = 0; out.println("init"); } public void paint(Graphics g) { g.drawString(HelloWorld.substring(0, idx), 30, 30); } public void start() { out.println("start"); if(helloThread == null) { helloThread = new Thread(this); helloThread.start(); } } public void run() { out.println("run"); for(;;) { try { Thread.sleep(400); }catch(InterruptedException e) { } out.println(" idx = " + idx); idx = (idx < HelloWorld.length()) ? idx++ : 0;//この部分が問題の部分です repaint(); } } }

    • ベストアンサー
    • Java
  • Appletのrepaint()が動作しません

    import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか?

  • JAVAコードの実行順番が理解できず困っています

    JAVAを勉強したての超初心者です。 以下のコードの実行順番が理解できず困っています。 1 public class Test { 2 public static void main(String[] args){ 3 System.out.println("1"); 4 Chara ch = (int num) -> { 5 System.out.println(num); 6 System.out.println("3"); 7 }; 8 System.out.println("2"); 9 ch.move(100); 10 } 11 } 12 @FunctionalInterface 13 interface Chara{ 14 void move(int num); 15 } 実行しますと『1、2、100、3』の順序で表示されますが、4行目のラムダ式の実装部分が実行されないのは何故なのか分かりません。 自分で考えた解釈としまして、4行目のラムダ式のインスタンス生成だけはするが、5・6行目は実行せず通過、8・9行目の処理を行い、9行目のメソッド(ch.move(100))呼出しでラムダ式の実装部分が実行されると思っています。 ネットで色々とJavaの実行順番の解説等を探してみましたが、見つからなく質問しました。 拙い文章で恐縮しますが、実行順序解説宜しくお願い致します。

    • ベストアンサー
    • Java