Создание собственных компонентов. Компонент Canvas.
Создать свой компонент, дополняющий свойства и методы уже существующих компонентов AWT, очень просто – надо лишь образовать свой класс как расширение существующего класса Button, TextField или другого класса-компонента.
Если надо скомбинировать несколько компонентов в один, новый, компонент, то достаточно расширить класс Panel, расположив компоненты на панели.
Если же требуется создать совершенно новый компонент, то AWT предлагает две возможности: создать "тяжелый" или "легкий" компонент. Для создания собственных "тяжелых" компонентов в библиотеке AWT есть класс canvas – пустой компонент, для которого создается свой peer-объект графической системы.
Компонент Canvas
Компонент canvas – это пустой компонент. Класс canvas очень прост – в нем только конструктор по умолчанию Canvas () и пустая реализация метода paint(Graphics g).
Чтобы создать свой "тяжелый" компонент, необходимо расширить класс canvas, дополнив его нужными полями и методами, и при необходимости переопределить метод paint ().
Например, как вы заметили, на стандартной кнопке Button можно написать только одну текстовую строку. Нельзя написать несколько строк или отобразить на кнопке рисунок. Создадим свой "тяжелый" компонент – кнопку с рисунком.
В листинге 10.7 кнопка с рисунком – класс FlowerButton. Рисунок задается методом drawFiower (), а рисуется методом paint (). Метод paint (), кроме того, чертит по краям кнопки внизу и справа отрезки прямых, изображающих тень, отбрасываемую "выпуклой" кнопкой. При нажатии кнопки мыши на компоненте такие же отрезки чертятся вверху и слева – кнопка "вдавилась". При этом рисунок сдвигается на два пиксела вправо вниз – он "вдавливается" в плоскость окна.
Кроме этого, в классе FlowerButton задана реакция на нажатие и отпускание кнопки мыши. Это мы обсудим в главе 12, а пока скажем, что при каждом нажатии и отпускании кнопки меняется значение поля isDown и кнопка перечерчивается методом repaint (). Это достигается выполнением методов mousePressed() и mouseReleased().
Для сравнения рядом помещена стандартная кнопка типа Button того же размера. Рис. 10.7 демонстрирует вид этих кнопок.