Пример изображения с двойной буферизацией в Jpanel

Я хотел бы знать, верна ли моя реализация для изображения с двойной буферизацией ... потому что я заметил, что дрожат границы моего изображения, которое я перемещаю на экране ... Это нормально ??

public void paintComponent(Graphics g) {
    Image bufferimage= createImage(180,180);
    Graphics dbg= bufferimage.getGraphics();

    //clean the screen
    dbg.setColor(new Color(100,100,100));
    dbg.fillRect(0,0,getWidth(),getHeight());

    if (game_is_running) {
       // draw various type of object with drawImage
       for(int i=0; list[i]!=null; i++) {
           list[i].draw(dbg);
       }
       target.draw(dbg);
       I.draw(dbg);
    }

    //finally draw the image linked to graphics
    g.drawImage(bufferimage,0,0,this);
}

person user2695795    schedule 19.08.2013    source источник


Ответы (2)


Перенесите создание метода bufferimage из метода paintComponent(). Вам не нужно создавать это каждый раз, когда вызывается этот метод. Вы все равно рисуете всю поверхность.

Когда вы закончите с Graphics, полученным из bufferImage (то есть переменной dbg в вашем случае), вы должны вызвать для нее dispose().

Наконец, вы можете обойтись без второго изображения, если убедитесь, что ваш компонент и компоненты, содержащие его, имеют свойство doubleBufferred, установленное на true.

person c.s.    schedule 19.08.2013
comment
Ваш последний абзац, вероятно, самый важный. Большинство компонентов Swing по умолчанию имеют двойную буферизацию. - person Harald K; 19.08.2013

Все, что должен делать метод paintComponent(), — это рисовать изображение.

Код «если игра запущена» не принадлежит методу paintComponent(). Идея состоит в том, чтобы иметь таймер или что-то, что изменяет состояние вашей игры и делает пользовательский рисунок на вашем изображении. Затем, когда Swing вызывает метод paintComponent(), вы просто рисуете изображение в его текущем состоянии.

Взгляните на DrawOnImage пример из Подходы к рисованию на заказ. Код добавляет прямоугольники к изображению с помощью мыши. Затем всякий раз, когда компонент перерисовывается, изображение рисуется.

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

person camickr    schedule 19.08.2013