Всплывающее меню (popup menu) появляется обычно при нажатии или отпускании правой или средней кнопки мыши и является контекстным (context) меню. Его команды зависят от компонента, на котором была нажата кнопка мыши. В языке Java всплывающее меню — объект класса Рорирмепи. Этот класс расширяет класс Menu, следовательно, наследует все свойства меню и пункта меню Menultem. Всплывающее меню присоединяется не к строке меню типа MenuBar или к меню типа Menu в качестве подменю, а к определенному компоненту. Для этого в классе component есть метод add(PopupMenu menu).
У некоторых компонентов, например TextFieid и TextArea, уже существует всплывающее меню. Подобные меню нельзя переопределить.
Присоединить всплывающее меню можно только к одному компоненту. Если надо использовать всплывающее меню с несколькими компонентами в контейнере, то его присоединяют к контейнеру, а нужный компонент определяют с помощью метода getcomponent () класса MouseEvent, как показано в листинге 13.2.
Кроме унаследованных свойств и методов, в классе PopupMenu есть метод show (Component comp, int x, int у), показывающий всплывающее меню на экране так, что его левый верхний угол располагается в точке (х, у) в системе координат компонента сотр. Чаще всего это компонент, на котором нажата кнопка мыши, возвращаемый методом getcomponent (). Компонент comp должен быть внутри контейнера, к которому присоединено меню, иначе возникнет исключительная ситуация.
Всплывающее меню появляется в MS Windows при отпускании правой кнопки мыши, в Motif— при нажатии средней кнопки, а в других графических системах могут быть иные правила. Чтобы учесть эту разницу, в класс MouseEvent введен логический метод isPopupTrigger (), показывающий, что
возникшее событие мыши вызывает появление всплывающего меню. Его нужно вызывать при возникновении всякого события мыши, чтобы проверять, не является ли оно сигналом к появлению всплывающего меню, т. е. обращению к методу showo. Было бы слишком неудобно включать такую проверку во все семь методов классов-слушателей событий мыши. Поэтому метод IsPopupTrigger () лучше ВЫЗЫВНТЬ В методе processMouseEvent().
Переделаем еще раз программу рисования из листинга 12.4, введя в класс scribble всплывающее меню для выбора цвета рисования и очистки окна и изменив обработку событий мыши. Для простоты уберем строку меню, хотя ее можно было оставить. Результат показан в листинге 13.2, а на Рисунок 13.3 — вид всплывающего меню в MS Windows.