電子書籍の厳選無料作品が豊富!

わざわざ見て下さってありがとうございます!
マルチスレッドのアプレットを作っています。全部書くと多すぎるので、およそのものを書きました。
●●●●プログラム本体開始●●●●
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秒毎の方は全然実行してくれないのです。
コンソールを見ると、

リペイント直前
リペイント通過

と、毎回「アップデイト実行」「ペイント実行」が出力されないのです。何がいけないのでしょうか?
万が一、大切な部分を省略していたり、不足の部分がございましたら、教えて頂ければ追加で掲載致します。
どうか宜しくお願い致します。

A 回答 (1件)

 こんばんは。



>RPG hero = new RPG();
>Thread heroStep = new Thread(hero);
>heroStep.start();

 まず、思いつくのが、RPGクラスのインスタンスをひとつ余分に作っているのが問題ですね。
 これだと、RPGクラスのインスタンスが二つあることになります。
 runメソッド内で表示されていないRPGクラスのrepaintを呼んでいることになります。

 上記コードは、

Thread heroStep = new Thread(this);
heroStep.start();

 こう書くべきだと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/05/15 00:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!