Модель обработки "поставщик-потребитель"
В листинге 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.
Рис. 15.1 демонстрирует вывод, этой программы.
Рис. 15.1. Изображение, созданное по точкам
Интерфейс imageConsumer описывает семь методов, самыми важными из которых являются два метода setPixeis (). Первый:
setPixels(int x, int y, int width, int height, ColorModel model, byte[] pix, int offset, int scansize);
Второй метод отличается только тем, что массив pix содержит элементы типа int.
К этим методам обращается поставщик для передачи пикселов потребителю. Передается прямоугольник шириной width и высотой height с заданным верхним левым углом (х, у), заполняемый пикселами из массива pix, начиная с индекса offset. Каждая строка занимает scansize элементов массива pix. Цвета пикселов определяются в цветовой модели model (обычно это модель RGB).
На рис. 15.2 показана иерархия классов, реализующих модель "поставщик-потребитель".
Рис. 15.2. Классы, реализующие модель "поставщик-потребитель"