Если tearOff == true и графическая оболочка умеет создавать отсоединяемое меню, то оно будет создано. В противном случае этот аргумент просто игнорируется.

Наконец, надо назначить действия командам меню. Команды меню типа MenuItem порождают события типа ActionEvent, поэтому нужно присоединить к ним объект класса-слушателя как к обычным компонентам, записав что-то вроде

create.addActionListener(new SomeActionEventHandler()); open.addActionListener(new AnotherActionEventHandler());

Пункты типа CheckboxMenuItem порождают события типа ItemEvent, поэтому надо обращаться к объекту-слушателю этого события:

disk.addItemListener(new SomeItemEventHandler());

Очень часто действия, записанные в командах меню, вызываются не только щелчком кнопки мыши, но и "горячими" клавишами-акселераторами (shortcut), действующими чаще всего при нажатой клавише . На экране в пунктах меню, которым назначены "горячие" клавиши, появляются подсказки вида Ctrl+N, Ctrl+O. "Горячая" клавиша определяется объектом класса MenuShortcut и указывается в его конструкторе константой класса KeyEvent, например:

MenuShortcut keyCreate = new MenuShortcut(KeyEvent.VK N);

После этого "горячей" будет комбинация клавиш +. Затем полученный объект указывается в конструкторе класса MenuItem:

MenuItem create = new MenuItem("Создать", keyCreate);

Нажатие комбинации клавиш + будет вызывать окно создания. Эти действия, разумеется, можно совместить, например:

MenuItem open = new MenuItem("Открыть...", new MenuShortcut(KeyEvent.VK O));

Можно добавить еще нажатие клавиши . Действие пункта меню будет вызываться нажатием комбинации клавиш ++, если воспользоваться вторым конструктором:

MenuShortcut(int key, boolean useShift); с аргументом useShift == true.

В листинге 10.9 приведена полная программа рисования с обработкой событий. Ее объяснение отложим до главы 15. Результат работы программы показан на рис. 10.10.

Листинг 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();

Перейти на страницу:

Все книги серии В подлиннике

Похожие книги