Иллюстрированный самоучитель по Java

       

Всплывающее меню


Всплывающее меню

(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.



Листинг 13.2.




Программа рисования с всплывающим меню

import j ava.awt.* ; 

import j ava.awt.event.*;

public class PopupMenuScribble extends Frame{ 

public PopupMenuScribble(String s){ super (s) ;

ScrollPane pane = new ScrollPane(); 

pane.setSize(300, 300); 

add(pane, BorderLayout.CENTER);

Scribble scr = new Scribble(this, 500, 500); 

pane.add(scr);

addWindowListener(new WinClose()); 

pack ();

setVisible(true); 



class WinClose extends WindowAdapter{

public void windowClosing(WindowEvent e){

System.exit(0); 





public static void main(String[] args){

new PopupMenuScribble(" \"Рисовалка\" с всплывающим меню"); 



}

class ScriBble extends Component implements ActionListener{ 

protected int lastX, lastY, w, h; 

protected Color currColor = Color.black; 

protected Frame f;

protected PopupMenu c;

public Scribble(Frame frame, int width, int height)!{ 

f = frame; w = width; h = height; 

enableEvents(AWTEvent.MOUSE_EVENT_MASK | 

        AWTEvent.MOUSEJtoTIONJEVENT_MASK);

с = new PopupMenu ("Цвет") ;

add(c);

Menultera clear = new Menultem("Очистить",

    new MenuShortcut(KeyEvent.VK_D)); 

Menultem red = new Menultem("Красный"); 

Menultem green = new Menultem("Зеленый"); 

Menultem blue = new Menultern("Синий"); 

Menultem black = new Menultem("Черный"); 

c.add(red); c.add(green); c.add(blue); 



c.add(black); с.addSeparator(); с.add(clear);

red.addActionListener(this); 

green.addActionListener(this); 

blue.addActionListener(this); 

black.addActionListener(this); 

clear.addActionListener(this); 



public Dimension getPreferredSize()

{

return new Dimension(w, h); 

}

public void actionPerformed(ActionEvent event){

String s = event.getActionCommand();

if (s.equals("Очистить")) repaint();

else if (s.equals("Красный")) currColor = Color.red;

else if (s.equals("Зеленый")) currColor = Color.green;

else if (s.equals("Синий")) currColor = Color.blue;

else if (s.equals("Черный")) currColor = Color.black; 

}

public void processMouseEvent(MouseEvent e){ 

if (e.isPopupTrigger())

c.show(e.getComponent (), e.getXO, e.getY()); 

else if (e.getlDO == MouseEvent.MOUSE_PRESSED){

lastX = e.getX(); lastY = e.getY(); }

else super.processMouseEvent(e); }

public void processMouseMotionEvent(MouseEvent e){ 

if (e.getlDO = MouseEvent.MOUSE_DRAGGED){ 

Graphics g = getGraphics();

g.setColor(currColor) ;

g.drawLinedastX, lastY, e.getX(), e.getY()); 

lastX = e.getX(); lastY = e.getY(); 

}

else super.processMouseMotionEvent(e); 



}





Рис. 13.3.


Программа рисования  с всплывающим меню


Содержание раздела