2016-11-23 5 views
0

Привет, я сделал эту программу, которая создает максимум 15 шаров, случайно помещенных на экран, и каждый из них имеет свою собственную runnable, однако моя проблема в том, что runnable работает только один раз при каждом нажатии кнопки, когда я хочу, чтобы он постоянно проверял см., если мяч вне пределов. Как бы это сделать, я перемещаю реализацию runnable в paintComponent, и это работает, но я не хочу этого делать.Как я могу реализовать свою runnable, чтобы проверить рекурсивно?

Вот код, который выполняется при каждом нажатии кнопки;

public static void addBall() throws InterruptedException { 
    Ball.balls[BallListener.balls] = new Ball(); 
    ballPanel.add(Ball.balls[BallListener.balls]); 
    Runnable r = new BallRunnable(); 
    Thread t1 = new Thread(r); 
    t1.start(); 
    try { 
     t1.join(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(BallComponent.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

нужно сделать так, работает ли он работоспособный несколько раз для нескольких шаров, я также хотел бы иметь каждый шар имеет свой собственные работоспособный. вот код для runnable;

public class BallRunnable implements Runnable { 

private static Random rand = new Random(); 
public static double speed = 0.2f; 
public static boolean end = false; 

public BallRunnable() { 

} 

public void run() { 
    boundsCheckY1(); 
    boundsCheckX1(); 
    boundsCheckY2(); 
    boundsCheckX2(); 
} 

public void boundsCheckX1() { 
    int temp; 

    for (int i = 0; i < BallListener.balls; i++) { 
     double x = Ball.balls[i].getXCo(); 
     if (x < 1) { 
      temp = rand.nextInt(5) + 1; 

      if (temp == 1) { 
       Ball.balls[i].setGoRight(true); 
       Ball.balls[i].setGoLeft(false); 
       Ball.balls[i].setGoUp(false); 
       Ball.balls[i].setGoDown(false); 
       Ball.balls[i].setDiagonalUp(false); 
       Ball.balls[i].setDiagonalDown(false); 
      } else if (temp == 2) { 
       Ball.balls[i].setGoRight(true); 
       Ball.balls[i].setGoLeft(false); 
       Ball.balls[i].setGoUp(true); 
       Ball.balls[i].setGoDown(false); 
       Ball.balls[i].setDiagonalUp(false); 
       Ball.balls[i].setDiagonalDown(false); 
      } else if (temp == 3) { 
       Ball.balls[i].setGoRight(true); 
       Ball.balls[i].setGoLeft(false); 
       Ball.balls[i].setGoUp(false); 
       Ball.balls[i].setGoDown(true); 
       Ball.balls[i].setDiagonalUp(false); 
       Ball.balls[i].setDiagonalDown(false); 
      } else if (temp == 4) { 
       Ball.balls[i].setGoRight(true); 
       Ball.balls[i].setGoLeft(false); 
       Ball.balls[i].setGoUp(false); 
       Ball.balls[i].setGoDown(false); 
       Ball.balls[i].setDiagonalUp(true); 
       Ball.balls[i].setDiagonalDown(false); 

      } else if (temp == 5) { 
       Ball.balls[i].setGoRight(true); 
       Ball.balls[i].setGoLeft(false); 
       Ball.balls[i].setGoUp(false); 
       Ball.balls[i].setGoDown(false); 
       Ball.balls[i].setDiagonalUp(false); 
       Ball.balls[i].setDiagonalDown(true); 
      } 
     } 
    } 
} 

Это повторение для всех четырех сторон.

ответ

0

Похоже, что вы не хотите, чтобы новые потоки завершались, если так поставить цикл в методе run с соответствующим интервалом ожидания, чтобы поддерживать поток в живом состоянии.

+0

Возможно, я не могу сделать это, не заставляя приложение замораживаться, и мне нужно, чтобы он работал в фоновом режиме как его просто контролер. –

+1

Тогда не позволяйте потоку обработки событий присоединиться к нему. –