Проблема с Thread.sleep (x) в цикле for - Java - PullRequest
2 голосов
/ 30 марта 2011

Я делаю рамку, которая содержит круглый прямоугольник.Этот прямоугольник постоянно (перерисовывает) себя с меньшими значениями.

План таков: сначала прямоугольник уменьшается в ширину (x), после этого прямоугольник уменьшается в высоте (y).

Но сейчас я просто хочу уменьшить ширину.Но у меня уже есть проблемы.

Обратите внимание, я рисую только границы прямоугольника, поэтому я не хочу его заполнять.

Я сделал цикл for следующим образом:

 for (rectWidth = 470; rectWidth >= 0; --rectWidth) {

           try {
                //simply made to represent rectWidth's value, not really relevant
                System.out.println("rectWidth is: " + rectWidth);

                //draw the rectangle with it's new width, ignore the "rectHeight" for now.
                g.drawRoundRect(5, 5, rectWidth, rectHeight, 10, 10);

                //this Thread.sleep is messing up my frame which has an instance of this class added 
                //to it also, my program is uninterruptable when adding this Thread.sleep
                Thread.sleep(500);

            } catch (Exception ex) {
                //rectangle's value will be returned here when interrupted.

          }
         }

Мой вопрос заключается в том, как я могу добавить «спящий» в цикл for, чтобы рисунок не шел слишком быстро, не мешая моему кадру.Этот thread.sleep портит мою рамку так, что я даже больше не вижу прямоугольник.

Я хочу добиться плавного (пере) рисования прямоугольника.(И да, я знаю, так как этот фрагмент кода теперь не перерисовывает прямоугольник, а постоянно рисует прямоугольник чуть меньшего размера в кадре.)

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

Причина, по которой прямоугольник не отображается, заключается в том, что отображение обновляется в EventDispatchThread, который, вероятно, является тем же, что и ваш цикл.То есть он не может нарисовать прямоугольник, потому что он слишком занят во сне.

Решение состоит в том, чтобы использовать Swing Timer , который будет запускаться и бездействовать, отправляя задачи в EventDispatchThread при обновлении.

0 голосов
/ 30 марта 2011

Также вы можете начать рисовать нить

@Override
public void run(){
  while(shouldDraw())
  this.wait(500);

  yourCalculations(); // maybe setting fields in runnable object

  SwingUtilities.invokeAndWait(yourRunnableObject); // or invokeLater if you prefer non blocking version
  }

Этот код показывает только концепцию (я пропустил синхронизацию и обработку исключений). SwingTimer выглядит более элегантно, но я никогда не использовал его.

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