Изображение построенное по точкам
Листинг 15.1. Изображение, построенное по точкам
import java.awt.*;
import j ava.awt.event.*;
import java.awt.image.*;
class InMemory extends Frame {
private int w = 100, h = 100;
private int[] pix = new int[w * h];
private Image img;
InMemory(String s)( super(s);
int i = 0;
for (int у = 0; у < h; y++){
int red = 255 * у / (h - 1);
for (int x = 0; x < w; x++){
int green = 255 * x / (w — 1) ;
pix[i++] = (255 << 24)|(red << 16)|(green << 8)| 128; } }
setSize(250, 200);
setVisible(true);
}
public vqid paint(Graphics gr){
if (img == null)
img = createlmage(new MemoryImageSource<w, h, pix>
0, w));
gr.drawlmage(img, 50, 50, this);
}
public static void main(String[] args){
Frame f= new InMemory(" Изображение в памяти");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit (0);
}
});
}
}
В листинге 15.1 в конструктор класса-поставщика MemoryimageSource (w, h, pix, о, w) заносится ширина w и высота h изображения, массив pix, смещение в этом массиве о и длина строки w. Потребителем служит изображение img, которое создается методом createlmage () и выводится на экран методом drawlmage(img, 50, 50, this). Левый верхний угол изображения img располагается в точке (50, 50) контейнера, а последний аргумент this показывает, что роль imageObserver играет сам класс InMemory. Это заставляет включить в метод paint о проверку if (img == null), иначе изображение будет постоянно перерисовываться. Другой способ избежать этого — переопределить метод imageupdate (), о чем говорилось в главе 14, просто написав В нем return true.