Создание "легкого" компонента
"Легкий" компонент, не имеющий своего peer-объекта в графической системе, создается как прямое расширение класса component или Container. При этом необходимо задать те действия, которые в "тяжелых" компонентах выполняет peer-объект.
Например, заменив в листинге 10.7 заголовок класса FlowerButton строкой:
class FlowerButton extends Component implements MouseListener{
…а затем перекомпилировав и выполнив программу, вы получите "легкую" кнопку, но увидите, что ее фон стал белым, потому что метод setBackground(Color.lightGray) не сработал.
Это объясняется тем, что теперь всю черную работу по изображению кнопки на экране выполняет не peer-двойник кнопки, а "тяжелый" контейнер, в котором расположена кнопка, в нашем случае класс Frame. Контейнер же ничего не знает о том, что надо обратиться к методу setBackground (), он рисует только то, что записано в методе paint (). Придется убрать метод setBackground () из конструктора и заливать фон серым цветом вручную в методе paint (), как показано в листинге 10.8.
"Легкий" контейнер не умеет рисовать находящиеся в нем "легкие" компоненты, поэтому в конце метода paint () "легкого" контейнера нужно обратиться к методу paint () суперкласса:
super.paint(g);
Тогда рисованием займется "тяжелый" суперкласс-контейнер. Он нарисует и лежащий в нем "легкий" контейнер, и размещенные в контейнере "легкие" компоненты.
Совет
Завершайте метод paint () "легкого" контейнера обращением к методу paint () суперкласса.
Предпочтительный размер "тяжелого" компонента устанавливается peer-объектом, а для "легких" компонентов его надо задать явно, переопределив метод getPreferredSize(), иначе некоторые менеджеры размещения, например FlowLayout (), установят нулевой размер, и компонент не будет виден на экране.
Совет
Переопределяйте метод getPref erredSize ().
Интересная особенность "легких" компонентов – они изначально рисуются прозрачными, не закрашенная часть прямоугольного объекта не будет видна. Это позволяет создать компонент любой видимой формы. Листинг 10.8 показывает, как можно изменить метод paint () листинга 10.7 для создания круглой кнопки и задать дополнительные методы, а рис. 10.8 демонстрирует ее вид.