Вопрос по multithreading, swing, java – Перекрашивание непрерывно в Java

1

У меня есть программа на 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 раздел не называется. Если это не правильный способ перекрасить компонент, то как мне его перекрасить?

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

Ваш Ответ

4   ответа
5

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

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

@Override
public void paintComponent(Graphics g){
3

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

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

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

1

что вы делаете, вас это тоже может заинтересовать. Это взято из 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() вызов, анимация может быть обновлена только частично, создавая эффект "разрывая".

Похожие вопросы