Как было сказано, каждый элемент меню по сути представляет собой кнопку, поэтому реагирует на те же события и позволяет присоединять к себе тех же слушателей, что и кнопка. * Поэтому мы можем назначить реакцию на команды меню точно также, как делали это выше. Например, чтобы при выборе в меню элемента «Выйти» программа прекращала свою работу, следует заменить в примере команду
fileMenu.add(new JMenuItem("Выйти"));
напоследовательностькоманд:
JMenuItem exit = new JMenuItem("Выйти");exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) {System.exit(0);}});fileMenu.add(exit);
Командой System.exit(0) прекращается работа текущего приложения.
Создание контекстного меню
Контекстное (или всплывающее) меню реализовано в классе JPopupMenu, очень похожему на класс JMenu. Отличительным методом этого класса является метод show(Componentcomp, int x, int y), отображающий меню в точке с заданными координатами относительно границ заданного компонента.
Как уже отмечалось, контекстное меню, как правило, отображается при щелчке правой кнопкой мыши над компонентом. Таким образом, чтобы отобразить меню, требуется добавить к этому компоненту слушателя мыши.
|
|
Рассмотрим пример, в котором к уже созданному нами окну добавляется метка с надписью и контекстное меню из двух элементов, связанное с этой меткой. Необходимо добавить вконструктор перед последней командой (setSize) следующий код:
label = new JLabel("КНИЖКА", new ImageIcon("1.gif"), JLabel.RIGHT);JPanelpanel = new JPanel();panel.add(label);popup = new JPopupMenu();popup.add(new JMenuItem("Прочитать"));popup.add(new JMenuItem("Сжечь"));label.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEventevent) { if (SwingUtilities.isRightMouseButton(event))popup.show(label, event.getX(), event.getY());}});setContentPane(panel);
При этом в определении класса окна следует ввести два поля:
JPopupMenupopup;JLabellabel;
Это необходимо для того, чтобы анонимный класс-слушатель мог обратиться к метке и к контекстному меню.
Приведенный пример также иллюстрирует применение полезного методаisRightMouseButton(MouseEventevent), определенного в классе вспомогательных утилит SwingUtilities. Метод получает информацию о событии мыши и отвечает на вопрос, была ли нажата именно правая кнопка мыши. Методы getX() и getY() возвращают координаты курсора мыши относительно наблюдаемого компонента.