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("Чeрный")) currColor = Color.black;
}
public void mousePressed(MouseEvent e){
return;
if ((e.getModifiers() & MouseEvent.BUTTON1 MASK) == 0) lastX = e.getX(); lastY = e.getY();
public void mouseDragged(MouseEvent e){
if ((e.getModifiers() & MouseEvent.BUTTON1 MASK) == 0) return; Graphics g = getGraphics(); g.setColor(currColor);
g.drawLine(lastX, lastY, e.getX(), e.getY());
lastX = e.getX(); lastY = e.getY();
}
public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseMoved(MouseEvent e){}
}
Рис. 10.10. Программа рисования с меню |
Всплывающее меню
add(PopupMenu menu).
У некоторых компонентов, например TextField и TextArea, уже существует всплывающее меню. Подобные меню нельзя переопределить.
Присоединить всплывающее меню можно только к одному компоненту. Если надо использовать всплывающее меню с несколькими компонентами в контейнере, то его присоединяют к контейнеру, а нужный компонент определяют с помощью метода getComponent () класса MouseEvent, как показано в листинге 10.10.
Кроме унаследованных свойств и методов, в классе PopupMenu есть метод show(Component comp, int x, int y), показывающий всплывающее меню на экране так, что его левый верхний угол располагается в точке (x, y) в системе координат компонента comp. Чаще всего это компонент, на котором нажата кнопка мыши, возвращаемый методом getComponent (). Компонент comp должен быть внутри контейнера, к которому присоединено меню, иначе возникнет исключительная ситуация.
Всплывающее меню появляется в MS Windows при отпускании правой кнопки мыши, в Motif — при нажатии средней кнопки, а в других графических системах могут быть иные правила. Чтобы учесть эту разницу, в класс MouseEvent введен логический метод isPopupTrigger(), показывающий, что возникшее событие мыши вызывает появление всплывающего меню. Его нужно вызывать при возникновении всякого события мыши, чтобы проверять, не является ли оно сигналом к появлению всплывающего меню, т. е. обращению к методу show (). Было бы слишком неудобно включать такую проверку во все семь методов классов-слушателей событий мыши. Поэтому метод isPopupTrigger() лучше вызывать в методе processMouseEvent ().
Переделаем программу рисования из листинга 10.9, введя в класс Scribble всплывающее меню для выбора цвета рисования и очистки окна и изменив обработку событий мыши. Для простоты уберем строку меню, хотя ее можно было оставить. Результат показан в листинге 10.10, а на рис. 10.11 — вид всплывающего меню в MS Windows.
import java.awt.*; import java.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.MOUSE_MOTION_EVENT_MASK) ;
c = new РорирМепи("Цвет");
add(c);
MenuItem clear = new Мепи^ешСОчистить",
new MenuShortcut(KeyEvent.VK D)); MenuItem red = new MenultemCKpacHbM");
MenuItem green = new MenuItem(,,Зеленый,,);
MenuItem blue = new MenuItem("Синий");
MenuItem black = new MenultemC'depHbM"); c.add(red); c.add(green); c.add(blue); c.add(black); c.addSeparator(); c.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();