Читаем Java 7 полностью

Если 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();

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

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

Java 7
Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др. Дано подробное изложение последней версии сервлетов, технологии JSP и библиотек тегов JSTL. Около двухсот законченных программ иллюстрируют рассмотренные приемы программирования. Приведена подробная справочная информация о классах и методах Core Java API.

Ильдар Шаукатович Хабибуллин

Программирование, программы, базы данных

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

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных