Главная » Java, Web » Апплеты и графика

0

Апплет сам по себе является графическим компонентом. Компонент — это визуальный элемент. К числу компонентов относятся кнопки, меню, текстовые поля, поля для ввода текста, поля с прокруткой, поля для отметки и т. п. Компоненты описываются в виде классов, основанных на классе java.awt.Component. Что касается апплетов Japplet, то большинство компонентов этих апплетов являются подклассами класса javax.swing.jcomponent. Каждый компонент отвечает за отображение самого себя своими средствами.

Все, что требуется от программиста, — это вставить требуемый компонент в апплет. Нет необходимости специально заботиться о том, как прорисовать апплет с компонентами на экране, — это происходит автоматически. Если появляется необходимость нарисовать что-либо в составе того или иного компонента, причем нарисовать какой-либо нестандартный элемент, не входящий в набор заранее определенных элементов, то для этого необходимо определить собственный класс компонента, в котором будут заданы методы его прорисовки.

Как уже было сказано в начале этой главы, в простых апплетах (не swing) рисование осуществляется при помощи метода paint (). Чтобы прорисовать элемент, необходимо определить подкласс класса Applet, вставив в него метод paint (), который будет осуществлять рисование. С апплетами JApplet ситуация несколько сложнее. Мы не можем рисовать в апплете JApplet, мы не можем рисовать ни в одном апплете верхнего уровня, ни в одном компоненте верхнего уровня пакета Swing. Для того чтобы иметь возможность рисовать компоненты, необходимо создать новый компонент, который будет использоваться в качестве своего рода холста, и этот компонент должен быть вставлен в апплет JApplet. Поэтому JApplet будет состоять по крайней мере из двух классов: класса апплета как такового JApplet и класса холста. Холст — это не очень правильное название. В данном случае холст — это не то, что определяется в классе canvas, который более всего подходит для того, чтобы носить название холста, однако термин этот в нашей ситуации довольно понятно описывает происходящее. Чаще всего класс для рисования основывается на классе javax.swing, jpanei, который представляет собой пустую область на экране. Как и любой компонент jcomponent, панель jpanei использует следующий метод для рисования самой себя: public void paintComponent(Graphics g)

Чтобы создать "холст", мы создаем класс на основе jpanei, в котором задаем метод paint Component (). Создаем объект, принадлежащий новому классу, вставляем класс в апплет JApplet. Когда приходит время прорисовать компонент, то вызывается метод paintcomponent (). Все это вовсе не так и сложно, но, тем не менее, немного более запутанно, чем в апплетах Applet.

Отметим, что в качестве параметра методу paintcomponent () передается объект типа Graphics. Чтобы иметь возможность что-либо рисовать, требуется графический контекст. Графический контекст — это объект класса java.awt .Graphics. Этот класс содержит методы рисования, с их помощью можно рисовать формы, выводить текст, создавать картинки. Каждый объект Graphics работает только с одним компонентом GUI (Graphic User Interface, графический интерфейс пользователя), принадлежащим подклассу jcomponent. Класс Graphics — это абстрактный класс, то есть мы не можем создать экземпляр этого класса напрямую, используя конструктор. Существует два способа получения графического контекста. Первый способ — вызов функции paintcomponent () и передача ей графического контекста, второй способ — использование метода getGraphics (). Этот метод есть в каждом компоненте, он используется для получения контекста, который может быть затем использован для рисования вне метода

paintComponent() .

Существует также метод repaint (), который удобно использовать тогда, когда в компоненте произошли изменения:

public void repaint();

Этот метод определен в классе component и выполняется немедленно, однако при этом не происходит рисования как такового. Метод paintComponent () должен быть вызван после того, как будет выполнен метод repaint (). Метод paintComponent () вызывается в нескольких случаях: когда компонент впервые отображается на экране и когда данный компонент станет видимым вновь после того, как был в течение некоторого времени закрыт другим окном. Эти примеры говорят о том, что метод paintComponent () должен быть достаточно гибким.

Перейдем к рассмотрению некоторых моментов, знание которых необходимо для работы с компонентами.

Координаты

Экран компьютера состоит из маленьких элементов — пикселов, которые мы будем представлять в виде квадратов, так что весь экран представляет собой сетку, состоящую из квадратных пикселов одинакового размера. Цвет каждого пиксела может меняться и устанавливается независимо от цвета других пикселов. Рисование на экране сводится к заданию цвета каждого пиксела.

Графический контекст выводится в прямоугольнике, состоящем из пикселов. Положение пиксела в прямоугольнике определяется двумя координатами (х, у). Верхний левый угол имеет координаты (0, 0). Горизонтальная координата х увеличивается слева направо, вертикальная координата у растет снизу вверх. Координаты и пикселы не связаны раз и навсегда, но положение пикселов удобнее всего описывать при помощи координат. Для каждого компонента можно определить его размер с помощью метода getsize(). Этот метод возвращает объект типа j ava. awt. Dimension. Этот объект имеет две переменные (высоту и ширину: getsizeo .width — ширина, getSize () .height — высота.

При создании апплета чаще всего мы не будем иметь представления о его размере. Размер апплета как правило задается в теге <applet>. Понятно, что не следует привязываться к фиксированному размеру апплета, размер апплета может меняться даже во время выполнения апплета. Об этом всегда следует помнить. Прочие компоненты апплета еще более "нестабильны" в отношении своих размеров. Поэтому полезно получать размер компонента перед тем, как нарисовать его. Это можно сделать, например, при помощи следующего кода:

public void paintComponent(Graphics g) { int width = getSize().width; // ширина компонента int height = getSize().height; // высота компонента … // рисование контекста компонента

}

Во время рисования необходимо знать размер компонента для вычисления значений координат (х,у).

Цвет

В языке Java, как правило, работают с системой цветов RGB. Как известно, любой цвет можно разложить на три независимых составляющих. Каждый цвет можно представить в виде комбинации трех чистых цветов различной интенсивности. В качестве базовых цветов используются красный (обозначаемый буквой R — "red"), зеленый (обозначаемый буквой G — "green") и синий (обозначаемый буквой В — "blue"). Цвет — это объект класса java.awt.Color. Новый цвет можно задать с помощью конструктора, указав интенсивности каждого компонента цвета:

myColor = new Color(г,д,b);

Существует два конструктора цвета. В одном случае цвет задается в виде набора из трех целых значений в диапазоне от 0 до 255. В другом случае три компонента цветовой гаммы в системе RGB описываются вещественными числами в диапазоне от 0.0F до 1.0F. Часто оказывается излишним создание нового цвета, так как в классе color определено несколько констант для часто используемых цветов (табл. 1.1).

Таблица 1.1. Константы цветов

Константа

Значение

Black

Черный

Blue

Синий

Cyan

Циановый

DarkGray

Темно-серый

Gray

Серый

Green

Зеленый

LightGray

Светло-серый

Magenta

Фуксиновый

Таблица 1.1 (окончание)

Константа

Значение

Orange

Оранжевый

Pink

Розовый

Red

Красный

White

Белый

Yellow

Желтый

Помимо системы RGB можно пользоваться системой HSB. В системе HSB цвет также определяется тремя параметрами, поэтому нет возможности создать другой конструктор класса color. Для получения значений HSB для цвета используется метод getHSBCoior. Чтобы создать цвет на основе трех значений HSB, вызовем этот метод: myColor = Color.getHSBCoior(h,s,b);

Значения H, S и В являются вещественными, они могут изменяться в пределах от 0.0F до 1.0F. Буквы Н, S и В соответствуют словам hue (цвет), saturation (насыщенность) и brightness (яркость).

Вот пример создания случайного цвета:

myColor = Color.getHSBCoior((float)Math.random(), 1.0F, 1.0F);

Обратите внимание на то, что необходимо использовать приведение типа, так как метод Math, random возвращает тип double.

Полезно поэкспериментировать с цветами, чтобы лучше их почувствовать.

Используйте файл ColorApplet.java (листинг 1.10) для вставки апплета в HTML-страницу ColorApplet.html (листинг 1.11).

Листинг 1.10. Файл ColorApplet.java

impo гt j ava.awt.*; impo rt j ava.awt.event.*; import java.applet.*;

public class ColorApplet extends Applet implements AdjustmentListener { private float[] hsb = new float[3]; // цвета HSB private int r = 0, g = 0, b = 0;                       // цвета RGB

// полосы прокрутки

private Scrollbar hueScroll, brightnessScroll, saturationScroll,

redScroll, greenScroll, blueScroll; // надписи полос прокрутки

private Label hueLabel, brightnessLabel, saturationLabel,

redLabel, greenLabel, blueLabel; private Canvas colorCanvas; // холст для цветового поля public void init() {

// получить HSB компоненты цвета для RGB = (0,0,0); Color.RGBtoHSB(0,0,0,hsb);

// создание полос прокрутки со значениями от 0 до 255

hueScroll = new Scrollbar(Scrollbar.HORIZONTAL, (int)(255*hsb[0]), 10, 0, 265);

saturationScroll = new Scrollbar(Scrollbar.HORIZONTAL, (int) (255*hsb[l] ) , 10, 0, 265);

brightnessScroll = new Scrollbar(Scrollbar.HORIZONTAL, (int) (255*hsb[2] ) , 10, 0, 265);

redScroll = new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 265);

greenScroll = new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 265);

blueScroll = new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 265);

// надписи, показывающие текущие значения цветов

hueLabel = new Label(" H = " + hsb[ 0 ] ) ;

saturationLabel = new Label(" S = " + hsb[1]);

brightnessLabel = new Label(" В = " + hsb[ 2 ] ) ;

redLabel = new Label(" R = 0");

greenLabel = new Label(" G = 0");

blueLabel = new Label(" В = 0");

// цвет фона полос прокрутки и надписей

hueScroll.setBackground(Color.lightGray);

saturationScroll.setBackground(Color.lightGray);

brightnessScroll.setBackground(Color.lightGray);

redScroll.setBackground(Color.lightGray);

greenScroll.setBackground(Color.lightGray);

blueScroll.setBackground(Color.lightGray);

hueLabel.setBackground(Color.white);

saturationLabel.setBackground(Color.white);

brightnessLabel.setBackground(Color.white);

redLabel.setBackground(Color.white);

greenLabel.setBackground(Color.white);

blueLabel.setBackground(Color.white);

// прослушивание изменений значений в полосах прокрутки hueScroll.addAdjustmentListener(this); saturationScroll.addAdjustmentListener(this); brightnessScroll.addAdjustmentListener(this);

redScroll.addAdjustmentListener(this); greenScroll.addAdjustmentListener(this); blueScroll.addAdjustmentListener(this);

// создание холста с цветом фона, соответствующим текущим значениям colorCanvas = new Canvas(); colorCanvas.setBackground(Color.black);

// создание внешнего вида апплета из трех областей равного размера, содержащих полосы прокрутки, метки-надписи и цветное поле */ setLayout(new GridLayout(1,3,3,3) ) ; setBackground(Color.gray); Panel scrolls = new Panel(); Panel labels = new Panel(); add(scrolls); add(labels); add(colorCanvas);

// вставка полей прокрутки и меток-надписей в соответствующие панели

scrolls.setLayout(new GridLayout(6,1,2,2));

scrolls.add(redScroll);

scrolls.add(greenScroll);

scrolls.add(blueScroll) ;

scrolls.add(hueScroll) ;

scrolls.add(saturationScroll);

scrolls.add(brightnessScroll);

labels.setLayout(new GridLayout(6,1,2,2));

labels.add(redLabel);

labels.add(greenLabel);

labels.add(blueLabel);

labels.add(hueLabel);

labels.add(saturationLabel);

labels.add(brightnessLabel);

} // end init();

public void adjustmentValueChanged(AdjustmentEvent evt) {

// данный метод вызывается, когда пользователь меняет положение

// одной из полос прокрутки

/ / при этом все метки и значения цветов

// изменяются на вновь установленные значения

int rl, gl, М;

rl = redScroll.getValue();

gl = greenScroll.getValue (); Ы = blueScroll.getValue();

if (r != rl | | g != gl | | b != Ы) {

/ / один из цветов RGB изменен г = rl;

g = gl; b = Ы;

Color.RGBtoHSB(r,g,b,hsb); }

else {

// один из цветов HSB изменен

hsb[0] = hueScroll.getValue0/255.OF;

hsb[1] = saturationScroll.getValue()/255.OF;

hsb[2] = brightnessScroll.getValue()/255.OF;

int rgb = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]);

r = (rgb » 16) & OxFF;

g = (rgb » 8) & OxFF;

b = rgb & OxFF; }

redLabel.setText(" R = " + r);

greenLabel.setText(" G = " + g);

blueLabel.setText(" В = " + b);

hueLabel.setText(" H = " + hsb[0]);

saturationLabel.setText(" S = " + hsb[1]);

brightnessLabel.setText(" В = " + hsb[2]);

redScroll.setValue(r);

greenScroll.setValue(g);

blueScroll.setValue(b);

hueScroll.setValue((int)(255*hsb[0]));

saturationScroll.setValue((int)(255*hsb[1]));

brightnessScroll.setValue((int)(255*hsb[2]));

colorCanvas.setBackground(new Color(r,g,b));

colorCanvas.repaint(); // перерисовка холста

} // end adjustmentValueChanged

public Insets getlnsets() {

// определение пустого пространства

// между границей апплета // и компонентами (3 пиксела)

return new Insets(3,3,3, 3) ; }

} // end class ColorChooserApplet

Листинг 1.11. Файл ColorApplet.html

<p align=center>

<applet code="ColorApplet.class" width=400 height=150 alt="(Tut dolzhen byt applet ‘ColorApplet’.)"> <font color="#E70000">

(Byla by Java, to byl by zeds applet "ColorChooserApplet" <br>.) </font> </applet> </p>

Рис. 1.13. Изменение цвета

В апплете представлены три полосы прокрутки, соответствующие цветам RGB и HSB. В зависимости от изменения положения ползунков цвет поля будет изменяться. Играя с цветами, можно наблюдать, как зависят друг от друга положения ползунков для этих двух представлений цветов (рис. 1.13).

При изменении цвета (параметр Н) с 0 до 1 начиная с красного, постепенно увеличивается интенсивность зеленого (до 1), затем интенсивность красного уменьшается (до 0), на следующем шаге растет интенсивность синего, после чего снижается интенсивность зеленого, затем вновь нарастает интенсивность красного, и, наконец, уменьшается интенсивность зеленого. При этом мы проходим всю палитру, видим все цвета радуги.

Шрифт

Шрифт имеет размер и стиль. Одни и те же символы могут быть показаны разным размером и разным стилем. Для отображения шрифта используются наборы символов. Таким образом, шрифт характеризуется названием, стилем и размером. Названия шрифтов могут меняться от системы к системе, но, как правило, существует стандартный набор шрифтов, которые присутствуют во всех системах, например, Serif, SansSerif, Monospaced, Dialog. В классе Font определены, в частности, следующие стили шрифтов:

?    Font.plain;

?    Font.italic;

?    Font.BOLD.

Размер шрифта задается в виде целого числа, по умолчанию используется размер 12. Для представления шрифтов используется класс java.awt.Font. Можно создать новый фонт, используя конструктор, например:

Font nashFont = new Font("Serif", Font.PLAIN, 12); Font bolshojFont = new Font("SansSerif", Font.BOLD, 32);

Каждый графический контекст обладает текущим шрифтом. Изменить текущий шрифт можно при помощи метода set Font (), например, для графического контекста д фонт можно поменять с помощью следующего метода:

д.setFont(bolshojFont);

Узнать, какой текущий шрифт установлен в данном контексте, можно при помощи следующего метода:

д.getFont();

Этот метод возвращает объект типа Font.

Каждый компонент имеет связанный с ним шрифт, который может быть задан при помощи метода set Font (font). Этот метод определен в классе component. При создании графического контекста для компонента, текущий шрифт контекста бывает равен текущему шрифту компонента.

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии