Если tearOff == true и графическая оболочка умеет создавать отсоединяемое меню, то оно будет создано. В противном случае этот аргумент просто игнорируется.
Наконец, надо назначить действия командам меню. Команды меню типа MenuItem порождают события типа ActionEvent, поэтому нужно присоединить к ним объект класса-слушателя как к обычным компонентам, записав что-то вроде
create.addActionListener(new SomeActionEventHandler()); open.addActionListener(new AnotherActionEventHandler());
Пункты типа CheckboxMenuItem порождают события типа ItemEvent, поэтому надо обращаться к объекту-слушателю этого события:
disk.addItemListener(new SomeItemEventHandler());
Очень часто действия, записанные в командах меню, вызываются не только щелчком кнопки мыши, но и "горячими" клавишами-акселераторами (shortcut), действующими чаще всего при нажатой клавише
MenuShortcut keyCreate = new MenuShortcut(KeyEvent.VK N);
После этого "горячей" будет комбинация клавиш
MenuItem create = new MenuItem("Создать", keyCreate);
Нажатие комбинации клавиш
MenuItem open = new MenuItem("Открыть...", new MenuShortcut(KeyEvent.VK O));
Можно добавить еще нажатие клавиши
MenuShortcut(int key, boolean useShift); с аргументом useShift == true.
В листинге 10.9 приведена полная программа рисования с обработкой событий. Ее объяснение отложим до
import java.awt.*; import java.awt.event.*;
public class MenuScribble extends Frame{ public MenuScribble(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);
MenuBar mb = new MenuBar(); setMenuBar(mb);
Menu f = new Menu^'J^m");
Menu v = new MenuC'B^") ; mb.add(f); mb.add(v);
MenuItem open = new MenuItem("OTKpbiTb...",
new MenuShortcut(KeyEvent.VK O)); MenuItem save = new MenuItem("CoxpaHHTb",
new MenuShortcut(KeyEvent.VK S)); MenuItem saveAs = new MenuItem("CoxpaHHTb как..."); MenuItem exit = new MenuItem(,,Выxод,,,
new MenuShortcut(KeyEvent.VK Q)) ; f.add(open); f.add(save); f.add(saveAs); f.addSeparator(); f.add(exit);
open.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ FileDialog fd = new FileDialog(new Frame(),
" Загрузить", FileDialog.LOAD); fd.setVisible(true);
}
});
saveAs.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ FileDialog fd = new FileDialog(new Frame(),
" Сохранить", FileDialog.SAVE); fd.setVisible(true);
}
});
exit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0);
}
});
Menu c = new Menu("UBeT");
MenuItem clear = new MenuItem("Очистить",
new MenuShortcut(KeyEvent.VK D)); v.add(c); v.add(clear);
MenuItem red = new MenuItem("Красный");
MenuItem green = new MenuItem("3exeHbM");
MenuItem blue = new MenuItem("Синий");
MenuItem black = new MenuItem("4epHbM"); c.add(red); c.add(green); c.add(blue); c.add(black);
red.addActionListener(scr); green.addActionListener(scr); blue.addActionListener(scr); black.addActionListener(scr); clear.addActionListener(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 MenuScribble(" \"Рисовалка\" с меню");
}
}
class Scribble extends Component implements
ActionListener, MouseListener, MouseMotionListener{ protected int lastX, lastY, w, h; protected Color currColor = Color.black; protected Frame f;
public Scribble(Frame frame, int width, int height){ f = frame; w = width; h = height; enableEvents (AWTEvent.MOUSE_EVENT_MASK |
AWTEvent. MOUSE_MOTION_EVENT_MASK) ; addMouseListener(this); addMouseMotionListener(this);
}
public Dimension getPreferredSize(){ return new Dimension(w, h);
}
public void actionPerformed(ActionEvent event){
String s = event.getActionCommand();
if (s.equals("Очистить")) repaint();