Моя программа потерпит крах через несколько секунд. Зачем? - PullRequest
1 голос
/ 16 марта 2011

Он работает в течение нескольких секунд и внезапно потерпит крах.

import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class CanvasUnit extends Canvas {

    private Timer timer; 
    private TimerTaskClass task;  
    private int Top=13 , Left=48;
    private int width = getWidth();
    private int height = getHeight();
    private static int SWidth = 10;
    private static int SHeight = 10;
    private int LStep = 5;
    private int TStep = 5;

    public CanvasUnit() {
       timer = new Timer();
       task = new TimerTaskClass();
       timer.schedule(task,10); 
    }

    public void paint(Graphics g) {

        g.setColor(0,0,0);
        g.fillRect(0, 0, width, height);
        g.setColor(255,255,255);

        g.drawRect(Left, Top, SWidth, SHeight);
    }
   private class TimerTaskClass extends TimerTask{

    public final void run(){ 

      if (Left > (width - SWidth)) { 
        LStep = LStep * (-1);
      } else if (Left < 0) {
        LStep = Math.abs(LStep); 
      }
      //
      if (Top > (height - SHeight)) {
        TStep = TStep * (-1); 
      } else if (Top < 0) {
        TStep = Math.abs(TStep);  
      }

      Left = Left + LStep;
      Top = Top + TStep;

      repaint();

      //Run the timer agian
      timer = new Timer();
      task = new TimerTaskClass();
      timer.schedule(task,10);
    }

   }
}

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Извините, мои предыдущие комментарии были неверны, потому что я думал, что вы используете LWUIT, не знаю, откуда у меня эта идея.Вы должны использовать что-то похожее на это

import javax.microedition.lcdui.*;

public class CanvasUnit extends Canvas {

    private int Top = 13, Left = 48;
    private int width = getWidth();
    private int height = getHeight();
    private static int SWidth = 10;
    private static int SHeight = 10;
    private int LStep = 5;
    private int TStep = 5;

    public CanvasUnit() {
        Thread t = new Thread(new Runnable() {

            public void run() {
                while (true) {

                    if (Left > (width - SWidth)) {
                        LStep = LStep * (-1);
                    } else if (Left < 0) {
                        LStep = Math.abs(LStep);
                    }
                    //
                    if (Top > (height - SHeight)) {
                        TStep = TStep * (-1);
                    } else if (Top < 0) {
                        TStep = Math.abs(TStep);
                    }

                    Left = Left + LStep;
                    Top = Top + TStep;

                    repaint();

                    try {
                        Thread.sleep(10);

                    } catch (Exception ex) {
                    }
                }
            }
        });
        t.start();
    }

    public void paint(Graphics g) {

        g.setColor(0, 0, 0);
        g.fillRect(0, 0, width, height);
        g.setColor(255, 255, 255);

        g.drawRect(Left, Top, SWidth, SHeight);
    }

}
1 голос
/ 16 марта 2011

Я думаю, что проблема в стеке над потоком, удалите:

   //Run the timer agian
   timer = new Timer();
   task = new TimerTaskClass();
   timer.schedule(task,10);

из метода run, потому что это сделает бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...