- •Лабораторная работа 4
- •Процессы, задачи и приоритеты
- •Реализация многозадачности в Java
- •Создание подкласса Thread
- •Реализация интерфейса Runnable
- •Применение анимации для мультизадачности
- •Апплет двойного назначения, реализующий интерфейс Runnable
- •Потоки (нити)
- •Состояние потока
- •Исключительные ситуации для потоков
- •Приоритеты потоков
- •Группы потоков
- •Многопотоковая графика и двойная буферизация
- •Использование методов updateиpaint
- •Двойная буферизация
Двойная буферизация
При двойной буферизации создается изображение в памяти, а затем оно выводится на экран.
Метод 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);
}
}