Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
89
Добавлен:
24.02.2016
Размер:
202.75 Кб
Скачать

Двойная буферизация

При двойной буферизации создается изображение в памяти, а затем оно выводится на экран.

Метод updateследует переопределить, чтобы не было мерцания при заполнении экрана фоном.

Поддержка двойной буферизации встроена в Swing-компоненты, но дляAWT-компонентов ее надо реализовывать. Ниже приводится пример апплета двойного назначения с реализацией двойной буферизации. Измененный код выделен жирным шрифтом.

Пример 5. Бегущие строки с двойной буферизацией

import javax.swing.*;

import java.applet.Applet;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

import java.util.Vector;

public class VertScroller extends Applet implements Runnable, ActionListener{

private Image offScreenImage;

private Graphics offScreenGraphics;

String strs[]={"First string", "Second string", "Third string"};

private Vector strings;

private int count = 0;

private int height;

private int width;

private Button startButton, stopButton;

private Thread animated;

public void update(Graphics g)

{

paint(g);

}

public void init()

{

strings = new Vector();

setBackground(Color.YELLOW);

height = getSize().height;

width = getSize().width;

offScreenImage = createImage(width,height);

offScreenGraphics = offScreenImage.getGraphics();

offScreenGraphics.setColor(Color.black);

startButton = new Button("Начало движения");

startButton.addActionListener(this);

add(startButton);

stopButton = new Button("Останов движения");

stopButton.addActionListener(this);

add(stopButton);

}

public void actionPerformed(ActionEvent e)

{

if ( e.getSource()==startButton)

{ if(strings.size() == 0 )

{

getGraphics().clearRect(0,0,width,height);

animated = new Thread(this);

animated.start();

}

int x = randomInt(width/2);

int y = randomInt(height/2);

int deltax = 1+randomInt(10);

int deltay = 1+randomInt(10);

if(count<strs.length)

{

strings.addElement(new MyString(strs[count++],x,y,deltax,deltay));

}

else

{

strings.addElement(new MyString("Простая строка",x,y,deltax,deltay));

}

}

else

if(e.getSource()==stopButton)

{

strings.removeAllElements();

animated = null;

count = 0;

}

repaint();

}

private int randomInt(int max) {

double x = Math.floor((double)(max+1)*Math.random()) ;

return (int)(Math.round(x));

}

public void run()

{

Thread my = Thread.currentThread();

while (my == animated)

{

MyString str;

for ( int i = 0; i < strings.size(); i++)

{

str =(MyString) strings.elementAt(i);

str.move(width,height);

}

repaint();

try

{

Thread.sleep(100);

}

catch (InterruptedException e)

{ }

}

}

public void paint(Graphics g)

{

MyString str;

offScreenGraphics.clearRect(0,0,width,height);

for ( int i = 0; i < strings.size(); i++)

{

str =(MyString) strings.elementAt(i);

str.draw(offScreenGraphics);

}

g.drawImage(offScreenImage,0,0,this);

}

public static void main(String[] args) {

JFrame frame = new JFrame ("Пример");

int width = 800;

int height = 300;

VertScroller appl = new VertScroller ();

appl.init();

frame.getContentPane().add(appl);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(width,height);

frame.setVisible(true);

}

}