2015-05-24 3 views
2

Я играю с графикой в ​​Java, используя JFrames, и пытаюсь полностью понять, когда действительно происходят изменения Graphics.Обновление графики Java JFrame

Предположим, у меня есть таймер, работающий каждую секунду, и каждую секунду меняется графика. Метод тика, например, будет запускаться каждую секунду ...

public void tick(Graphics g) { 
    g.fillRect(0,0,10,10); 
    //Do Some Computations 
    g.fillRect(0,0,someComputedWidth,someComputedHeight); 
} 

Являются ли графики мгновенно обновлены на дисплее компьютеров? Когда вызывается первый метод fillRect, этот прямоугольник мгновенно создается?

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

ответ

2

Для буфера ваших обновлений вы можете использовать BufferedImage:

@Override 
public void paintComponent(Graphics g){ 
    BufferedImage image = new BufferedImage(this.size.width, this.size.height, BufferedImage.TYPE_INT_RGB); 
    Graphics bgr = image.getGraphics(); 
    for(Tile t : this.tiles){ 
     t.draw(bgr); 
    } 
    super(bgr); 
    g.drawImage(image, 0, 0, null); 
    bgr.dispose();  
    image = null; 
} 

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

С несколькими рисоваемыми объектами, которые вырисовываются, и нет, или небольшая анимация, обновление непосредственно на дисплее не всегда имеет заметные эффекты, однако с более сложными задачами изображение «мерцает» и двойная буферизация - идеальное средство для этого.

+0

Прохладный. Whats the differnece между 'super.paintComponents (bgr);' и 'g.drawImage (image, 0, 0, null);'? Что обычно делает 'paintComponent()' 'и где он обычно вызывается? –

+1

super.paintComponents (bgr) вызывает метод для дерева наследования. Он рисует и делает все, что необходимо, с компонентами качания, присутствующими на панели. bgr - это графика bufferedImage, и в этом случае компоненты рисуются. g рисует на дисплей, в этом случае он рисует bufferedImage, при x = 0 y = 0 (верхний левый угол), null означает, что нет наблюдателя – Suspended

+0

Отлично! Термин для этого - двойная буферизация? –