Перекрашивание непрерывно в Java

У меня есть программа на Java, которая использует потоки. В моем методе бега у меня есть:

<code>public void run() {
    while(thread != null){
        repaint();
        System.out.println("hi");
        try {  
            Thread.sleep(1000);  
        } catch (InterruptedException e) {  
            break;  
        }  
    }
}

public void paintComponent(Graphics g) {
    // painting stuff
}
</code>

Проблема в том, что метод run выполняется, ноpaintComponent раздел не называется. Если это не правильный способ перекрасить компонент, то как мне его перекрасить?

 Hovercraft Full Of Eels30 апр. 2012 г., 03:53
Пожалуйста, покажите нам реальный код с хорошим форматированием. Ваш текущий код предполагает, что paintComponent равен метод run (), и это не может быть правдой. Итак, еще раз, отредактируйте свой вопрос, очистите, как можно больше своего кода и опубликуйте код, который имеет смысл, код, который вы используете в данный момент, и предоставьте нам больше информации о вашей проблеме. Предположим, что мы ничего не знаем о не показанном коде и не можем прочитать ваши мысли.
 cgull30 апр. 2012 г., 03:37
Это блок кода внутри класса, который расширяетJComponent? (потому чтоpaintComponent() этоJComponent метод).
 nIcE cOw30 апр. 2012 г., 08:37
Попробуй это на рукахприме, Надеюсь, это может помочь: -)

Ответы на вопрос(4)

Timer. Это не будет блокировать графический интерфейс и произойдет с любым интервалом, указанным в таймере. Конечно, по природе рисования Swing / AWT, если таймер настроен на слишком быстрое повторение, вызовы рисования могут объединяться (эффективно игнорироваться).

Также убедитесь, что методявляетс переопределить с помощью:

@Override
public void paintComponent(Graphics g){
Решение Вопроса

такого как JFrame. Вы вызываете paintComponent (g) для легких контейнеров, таких как JButton. Посмотрите, работает ли это.

что вы делаете, вас это тоже может заинтересовать. Это взято из Killer Game Программирование на Java Эндрю Дэвисон. Он говорит о активный рендеринг. Ваш игровой цикл эффективен:

public void run()
{
  while (running)
  {
    gameUpdate();                             // game state is updated
    gameRender();                             // render to a buffer
    paintScreen();                            // draw buffer to screen

    try
    {
      Thread.sleep(20);
    }
    catch (InterruptedException e) {;}
  }
}

И реализация экрана рисования (определяется подклассомJComponent):

private void paintScreen()
{
  final Graphics2D g2d;

  try
  {
    g2d = (Graphics2D) this.getGraphics();
    if (g2d != null && (backbuffer != null))
    {
      g2d.drawImage(backbuffer, 0, 0, null);
    }

    Toolkit.getDefaultToolkit().sync();       // sync the display on some systems [1]
    g2d.dispose();
  }
  catch (Exception e)
  {
    ;
  }
}

Из книги:

[Примечание 1] ЗвонокTookkit.sync() обеспечивает своевременное обновление дисплея. Это необходимо для Linux, который не очищает свой буфер дисплея автоматически. Безsync() вызов, анимация может быть обновлена только частично, создавая эффект "разрывая".

когда вам нужно (т.е. когда вы его обновляете).

 Jeffrey30 апр. 2012 г., 03:31
@ Anonymous181 Если ничего не изменилось, обновлять экран не нужно. Всякий раз, когда вы обновляете игровое состояние, вы должны указать своему компоненту перекрасить себя.
 Hot Licks30 апр. 2012 г., 03:33
И имейте в виду, что если вы спите в потоке пользовательского интерфейса, система не может обновиться.
 Anonymous18130 апр. 2012 г., 03:29
Но в игре мне нужно постоянно обновлять экран.
 Hot Licks30 апр. 2012 г., 03:31
Либо запускайте перерисовку, когда вы что-то обновляете, либо используете часы. Не существует такой вещи, как «непрерывная» перекраска.
 Hovercraft Full Of Eels30 апр. 2012 г., 03:31
@ Anonymous181: все вычисления являются дискретными, и ничто не является действительно непрерывным, включая временные интервалы. Ваш игровой цикл должен выбрать разумный отрезок времени и затем перекрасить. Менеджер рисования Swing объединит вашrepaint() запросы, если они приходят быстро и близко. 1+ к ответу.

Ваш ответ на вопрос