logo search
Хабибуллин

Меню JMenu

Каждое меню по существу представляет собой два компонента: "кнопку" с текстом и всплывающее меню типа JPopupMenu, появляющееся при щелчке кнопкой мыши по этой "кнопке". Как видно из рис. 11.1, меню JMenu относится к типу кнопок, расширяющих класс AbstractButton. Кроме того, класс JMenu непосредственно расширяет класс пункта меню JMenuItem. Следовательно, объект класса JMenu может служить пунктом какого-то другого меню, образуя таким образом подменю.

Меню создается конструктором JMenu(String). Второй конструктор JMenu(String, boolean) создает плавающее (tear-off) меню, если второй параметр равен true. Это возможно не во всех графических системах.

Вновь созданное меню не содержит ни одного пункта. Пункты меню добавляются один за другим методом add(JMenuItem) или методом add(String). Интересно, что эти методы возвращают ссылку на объект класса JMenuItem, а второй метод сам создает такой объект. Еще один метод, add(Component), добавляет к меню произвольный компонент. Это означает, что пунктом меню может служить любой компонент, но для встраивания в систему меню он должен реализовать интерфейс MenuElement. Например, иногда пунктом меню служит раскрывающийся список JComboBox. Но чаще среди пунктов меню встречаются экземпляры подклассов класса JMenuItem: подменю — объекты класса JMenu, кнопки выбора класса JCheckBoxMenuItem и радиокнопки класса

JRadioButtonMenuItem.

В меню можно отделить одну группу пунктов от другой горизонтальной чертой с по-

мощью метода addSeparator().

Пункты меню, включая разделительную черту, нумеруются сверху вниз, начиная от

нуля. Методы insert(JMenuItem, int), insert(String, int) и add(Component, int) позволяют

вставить новый пункт в указанную вторым параметром позицию, а метод insertSeparator(int) вставляет горизонтальную разделительную черту в указанную позицию.

Методы remove(Component), remove(int), remove(JMenuItem) и removeAll() удаляют пункты из

меню. В сочетании с методами add() и insert() они позволяют динамически перестроить меню при изменении содержимого окна.

Меню, как и всякой кнопке, можно назначить командную клавишу методом setMnemonic(int). Добавим командные клавиши-акселераторы к меню нашего примера:

file.setMnemonic(KeyEvent.VK_A); edit.setMnemonic(KeyEvent.VK_G); view.setMnemonic(KeyEvent.VK_D); help.setMnemonic(KeyEvent.VK_C);

Меню реагирует на событие класса MenuEvent, происходящее при раскрытии, выборе пунктов и закрытии меню.