Spec-Zone .ru
спецификации, руководства, описания, API
|
Меню обеспечивает экономящий место способ позволить пользователю выбирать одну из нескольких опций. Другие компоненты, с которыми пользователь может сделать выбор "один из многих", включают поля комбинированного списка, списки, переключатели, прядильщиков, и панели инструментов. Если какой-либо из Ваших пунктов меню выполняет действие, которое дублируется другим пунктом меню или кнопкой на панели инструментов, то в дополнение к этому разделу следует читать, Как Использовать Действия.
Меню уникальны в этом, условно, они не размещаются с другими компонентами в UI. Вместо этого меню обычно появляется или в строке меню или как раскрывающееся меню. Строка меню содержит одно или более меню и имеет общепринятое, зависимое от платформы расположение — обычно вдоль вершины окна. Раскрывающееся меню является меню, которое невидимо, пока пользователь не делает специфичное для платформы действие мыши, такое как нажатие правой кнопки мыши, по раскрывающемуся поддерживающему компоненту. Раскрывающееся меню тогда появляется под курсором.
Следующие данные показывают много связанных с меню компонентов: строка меню, меню, пункты меню, пункты меню переключателя, пункты меню флажка, и разделители. Как можно видеть, у пункта меню могут быть или изображение или текст, или оба. Можно также определить другие свойства, такие как шрифт и цвет.
Остальная часть этого раздела учит Вас компонентам меню и говорит Вам, как использовать различные функции меню:
Вот изображение иерархии наследования для связанных с меню классов:
Поскольку данные показывают, пункты меню (включая меню) являются просто кнопками. Вы могли бы задаваться вопросом, как меню, если это - только кнопка, показывает свои пункты меню. Ответ - то, что, когда меню активируется, оно автоматически переводит в рабочее состояние раскрывающееся меню, которое выводит на экран пункты меню.
Следующий код создает меню, показанные около начала этого раздела меню. Полужирные строки кода создают и соединяют объекты меню; другие кодовые наборы или настраивают объекты меню. Можно найти всю программу в MenuLookDemo.java
. Другие необходимые файлы перечисляются в примере, индексируют.
Поскольку у этого кода нет никакой обработки событий, меню не делают ничего полезного кроме смотреть, как они должны. Если Вы выполните пример, то Вы заметите, что несмотря на нехватку пользовательской обработки событий, меню и подменю появляются, когда они должны, и флажки и переключатели отвечают соответственно, когда пользователь выбирает их.
//Where the GUI is created: JMenuBar menuBar; JMenu menu, submenu; JMenuItem menuItem; JRadioButtonMenuItem rbMenuItem; JCheckBoxMenuItem cbMenuItem; //Create the menu bar. menuBar = new JMenuBar(); //Build the first menu. menu = new JMenu("A Menu"); menu.setMnemonic(KeyEvent.VK_A); menu.getAccessibleContext().setAccessibleDescription( "The only menu in this program that has menu items"); menuBar.add(menu); //a group of JMenuItems menuItem = new JMenuItem("A text-only menu item", KeyEvent.VK_T); menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_1, ActionEvent.ALT_MASK)); menuItem.getAccessibleContext().setAccessibleDescription( "This doesn't really do anything"); menu.add(menuItem); menuItem = new JMenuItem("Both text and icon", new ImageIcon("images/middle.gif")); menuItem.setMnemonic(KeyEvent.VK_B); menu.add(menuItem); menuItem = new JMenuItem(new ImageIcon("images/middle.gif")); menuItem.setMnemonic(KeyEvent.VK_D); menu.add(menuItem); //a group of radio button menu items menu.addSeparator(); ButtonGroup group = new ButtonGroup(); rbMenuItem = new JRadioButtonMenuItem("A radio button menu item"); rbMenuItem.setSelected(true); rbMenuItem.setMnemonic(KeyEvent.VK_R); group.add(rbMenuItem); menu.add(rbMenuItem); rbMenuItem = new JRadioButtonMenuItem("Another one"); rbMenuItem.setMnemonic(KeyEvent.VK_O); group.add(rbMenuItem); menu.add(rbMenuItem); //a group of check box menu items menu.addSeparator(); cbMenuItem = new JCheckBoxMenuItem("A check box menu item"); cbMenuItem.setMnemonic(KeyEvent.VK_C); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem("Another one"); cbMenuItem.setMnemonic(KeyEvent.VK_H); menu.add(cbMenuItem); //a submenu menu.addSeparator(); submenu = new JMenu("A submenu"); submenu.setMnemonic(KeyEvent.VK_S); menuItem = new JMenuItem("An item in the submenu"); menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_2, ActionEvent.ALT_MASK)); submenu.add(menuItem); menuItem = new JMenuItem("Another item"); submenu.add(menuItem); menu.add(submenu); //Build second menu in the menu bar. menu = new JMenu("Another Menu"); menu.setMnemonic(KeyEvent.VK_N); menu.getAccessibleContext().setAccessibleDescription( "This menu does nothing"); menuBar.add(menu); ... frame.setJMenuBar(theJMenuBar);
Поскольку код показывает, чтобы установить строку меню для a JFrame
, Вы используете setJMenuBar
метод. Добавить a JMenu
к a JMenuBar
, Вы используете add(JMenu)
метод. Добавить пункты меню и подменю к a JMenu
, Вы используете add(JMenuItem)
метод.
Пункты меню, как другие компоненты, могут быть в самое большее одном контейнере. Если Вы попытаетесь добавить пункт меню к второму меню, то пункт меню будет удален из первого меню прежде, чем быть добавленным к второму. Для способа реализовать многократные компоненты, которые делают ту же самую вещь, см.
Другие методы в предыдущем коде включают setAccelerator
и setMnemonic
, которые обсуждаются немного позже во Включении Работе Клавиатуры. setAccessibleDescription
метод обсуждается в Как к Support Assistive Technologies.
Обнаружить, когда пользователь выбирает a JMenuItem
, можно прислушаться к событиям действия (как Вы были бы для a JButton
). Обнаружить, когда пользователь выбирает a JRadioButtonMenuItem
, можно прислушаться или к событиям действия или к событиям элемента, как описано в том, Как Использовать Переключатели. Для JCheckBoxMenuItem
s, Вы обычно прислушиваетесь к событиям элемента, как описано в том, Как Использовать Флажки.
Вот код, который реализует обработку событий:
public class MenuDemo ... implements ActionListener, ItemListener { ... public MenuDemo() { //...for each JMenuItem instance: menuItem.addActionListener(this); ... //for each JRadioButtonMenuItem: rbMenuItem.addActionListener(this); ... //for each JCheckBoxMenuItem: cbMenuItem.addItemListener(this); ... } public void actionPerformed(ActionEvent e) { //...Get information from the action event... //...Display it in the text area... } public void itemStateChanged(ItemEvent e) { //...Get information from the item event... //...Display it in the text area... }
Для примеров обработки действия и событий элемента, см. кнопку, переключатель, и разделы флажка, так же как список примеров в конце этого раздела.
Меню поддерживают два вида альтернатив клавиатуры: мнемоника и акселераторы. Предложение мнемоники способ использовать клавиатуру, чтобы переместиться по иерархии меню, увеличивая доступность программ. Акселераторы, с другой стороны, предлагают сочетания клавиш, чтобы обойти навигацию по иерархии меню. Мнемоника для всех пользователей; акселераторы для продвинутых пользователей.
Мнемосхема является ключом, который заставляет уже видимый пункт меню быть выбранным. Например, в MenuDemo
у первого меню есть мнемосхема A, и у ее второго пункта меню есть мнемосхема B. Это означает это, когда Вы работаете MenuDemo
со стилем Java нажатие клавиш Alt и A заставляет первое меню появиться. В то время как первое меню видимо, нажимая клавишу B (с или без Высокого звука) заставляет второй пункт меню быть выбранным. Пункт меню обычно выводит на экран свою мнемосхему, подчеркивая первое возникновение мнемонического символа в тексте пункта меню как следующие шоу снимка.
Акселератор является сочетанием клавиш, которое заставляет пункт меню быть выбранным, видимо ли это. Например, нажимая Высокий звук и 2 ключа MenuDemo
заставляет первый элемент в подменю первого меню быть выбранным, не переводя меню в рабочее состояние. Только листовые пункты меню — у меню, которые не переводят другие меню в рабочее состояние — могут быть акселераторы. Следующий снимок показывает, как стиль Java выводит на экран пункт меню, у которого есть акселератор.
Можно определить мнемосхему или создавая пункт меню или с setMnemonic
метод. Чтобы определить акселератор, используйте setAccelerator
метод. Вот примеры установки мнемоники и акселераторов:
//Setting the mnemonic when constructing a menu item: menuItem = new JMenuItem("A text-only menu item", KeyEvent.VK_T); //Setting the mnemonic after creation time: menuItem.setMnemonic(KeyEvent.VK_T); //Setting the accelerator: menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_T, ActionEvent.ALT_MASK));
Как можно видеть, Вы устанавливаете мнемосхему, определяя KeyEvent
KeyStroke
KeyEvent
постоянный) и маска модифицирующей клавиши (определенный ActionEvent
Поскольку раскрывающиеся меню, в отличие от регулярных меню, не всегда содержатся компонентом, акселераторы в раскрывающихся пунктах меню не работают, если раскрывающееся меню не видимо.
Переводить раскрывающееся меню в рабочее состояние ( JPopupMenu
Точный жест, который должен перевести раскрывающееся меню в рабочее состояние, изменяется стилем. В Microsoft Windows пользователь условно переводит раскрывающееся меню в рабочее состояние, отпуская правую кнопку мыши, в то время как курсор по компоненту, который является раскрывающимся поддерживающим. В стили Java общепринятый триггер или нажимает правую кнопку мыши (для раскрывающегося, которое уходит, когда кнопка отпускается), или щелчок по этому (для раскрывающегося, которое не ложится спать).
//...where instance variables are declared: JPopupMenu popup; //...where the GUI is constructed: //Create the popup menu. popup = new JPopupMenu(); menuItem = new JMenuItem("A popup menu item"); menuItem.addActionListener(this); popup.add(menuItem); menuItem = new JMenuItem("Another popup menu item"); menuItem.addActionListener(this); popup.add(menuItem); //Add listener to components that can bring up popup menus. MouseListener popupListener = new PopupListener(); output.addMouseListener(popupListener); menuBar.addMouseListener(popupListener); ... class PopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { popup.show(e.getComponent(), e.getX(), e.getY()); } } }
У раскрывающихся меню есть несколько интересных деталей реализации. Каждый - то каждое меню, имеет связанное раскрывающееся меню. Когда меню активируется, оно использует свое связанное раскрывающееся меню, чтобы показать его пункты меню.
Другая деталь - то, что само раскрывающееся меню использует другой компонент, чтобы реализовать окно, содержащее пункты меню. В зависимости от обстоятельств, при которых выводится на экран раскрывающееся меню, раскрывающееся меню могло бы реализовать свое "окно", используя легкий компонент (такой как a JPanel
), "mediumweight" компонент (такой как a Panel
Window
Легкие всплывающие окна более эффективны чем тяжелые окна, но до Java Платформа SE 6 Обновлений 12 выпусков, они не работали хорошо, если у Вас были какие-либо тяжелые компоненты в Вашем GUI. Определенно, когда область дисплея легкого popup пересекает область дисплея тяжелого компонента, тяжелый компонент оттягивается на вершине. Это - одна из причин, что, до 6u12 выпуск, мы рекомендовали против смешивания тяжелых и легких компонентов. Если Вы используете более старый выпуск и абсолютно должны использовать тяжелый компонент в Вашем GUI, то можно вызвать JPopupMenu.setLightWeightPopupEnabled(false)
отключить легкие всплывающие окна. Для получения информации о смешивающихся компонентах в 6u12 выпуск и позже, пожалуйста, см.
Поскольку меню составляются из обычных компонентов Swing, можно легко настроить их. Например, можно добавить любой легкий компонент к a JMenu
или JMenuBar
. И потому что JMenuBar
использование BoxLayout
, можно настроить расположение строки меню только, добавляя невидимые компоненты к этому. Вот пример добавления компонента связующего звена к строке меню, так, чтобы последнее меню было в правом краю строки меню:
//...create and add some menus... menuBar.add(Box.createHorizontalGlue()); //...create the rightmost menu... menuBar.add(rightMenu);
Вот измененное расположение меню, которое выводит на экран MenuGlueDemo:
Другой способ изменить вид меню состоит в том, чтобы изменить менеджеров по расположению, используемых, чтобы управлять ими. Например, можно изменить менеджера по расположению строки меню от значения по умолчанию слева направо BoxLayout
к чему-то такой как GridLayout
.
Вот является изображение расположения меню этим MenuLayoutDemo
создает:
Следующие таблицы приводят обычно используемых конструкторов меню и методы. API для того, чтобы использовать меню попадает в эти категории:
Конструктор или Метод | Цель |
---|---|
|
Создает строку меню. |
|
Добавляет меню до конца строки меню. |
(в JApplet , JDialog , JFrame , JInternalFrame , JRootPane ) |
Наборы или получают строку меню апплета, диалогового окна, фрейма, внутренней рамки, или корневой области. |
Конструктор или Метод | Цель |
---|---|
|
Создает меню. Строка определяет текст, чтобы вывести на экран для меню. Action определяет текст и другие свойства меню (см. |
JMenuItem добавляют (JMenuItem) |
Добавляет пункт меню к текущему концу меню. Если параметром является строка, то меню автоматически создает a JMenuItem возразите, что выводит на экран указанный текст. Примечание версии: Прежде 1.3, единственный способ связаться Action с пунктом меню должен был использовать меню add(Action) метод, чтобы создать пункт меню и добавить это к меню. С 1.3, больше не рекомендуется тот метод. Можно вместо этого связать пункт меню с Action использование setAction метод. |
|
Добавляет разделитель к текущему концу меню. |
|
Вставляет пункт меню или разделитель в меню в указанной позиции. Первый пункт меню в позиции 0, втором в позиции 1, и так далее. JMenuItem и String параметры обрабатываются то же самое как в соответствии add методы. |
|
Удаляет указанный элемент (ы) из меню. Если параметром является целое число, то он определяет позицию пункта меню, который будет удален. |
Конструктор или Метод | Цель |
---|---|
|
Создает раскрывающееся меню. Дополнительный строковый параметр определяет title, который стиль мог бы вывести на экран как часть всплывающего окна. |
|
Добавляет пункт меню к текущему концу раскрывающегося меню. Если параметром является строка, то меню автоматически создает a JMenuItem возразите, что выводит на экран указанный текст. Примечание версии: Прежде 1.3, единственный способ связаться Action с элементом в раскрывающемся меню должен был использовать раскрывающееся меню add(Action) метод, чтобы создать пункт меню и добавить это к раскрывающемуся меню. С 1.3, больше не рекомендуется тот метод. Можно вместо этого связать пункт меню с Action использование setAction метод. |
|
Добавляет разделитель к текущему концу раскрывающегося меню. |
|
Вставляет пункт меню в меню в указанной позиции. Первый пункт меню в позиции 0, втором в позиции 1, и так далее. Component параметр определяет пункт меню, чтобы добавить. |
|
Удаляет указанный элемент (ы) из меню. Если параметром является целое число, то он определяет позицию пункта меню, который будет удален. |
|
По умолчанию Swing реализует окно меню, используя легкий компонент. Это может вызвать проблемы, если Вы используете какие-либо тяжелые компоненты в своей программе Swing, как описано в Переводе в рабочее состояние Раскрывающегося Меню. (Это - одна из нескольких причин избегать использования тяжелых компонентов.) Как обходное решение, вызвать JPopupMenu.setLightWeightPopupEnabled(false) . |
|
Выведите на экран раскрывающееся меню в указанном x, y позиция (определенный в том порядке целочисленными параметрами) в системе координат указанного компонента. |
Конструктор или Метод | Цель |
---|---|
|
Создает обычный пункт меню. Параметр значка, если есть определяет значок, который должен вывести на экран пункт меню. Точно так же строковый параметр определяет текст, который должен вывести на экран пункт меню. Целочисленный параметр определяет мнемосхему клавиатуры, чтобы использовать. Можно определить любую из соответствующих констант VK, определенных в KeyEvent.VK_A . Конструктор с |
JCheckBoxMenuItem () |
Создает пункт меню, который смотрит и действует как флажок. Строковый параметр, если таковые вообще имеются, определяет текст, который должен вывести на экран пункт меню. Если Вы определяете true для булева параметра тогда пункт меню первоначально выбирается (проверенный). Иначе, пункт меню первоначально отменяется. |
|
Создает пункт меню, который смотрит и действует как переключатель. Строковый параметр, если таковые вообще имеются, определяет текст, который должен вывести на экран пункт меню. Если Вы определяете true для булева параметра тогда первоначально выбирается пункт меню. Иначе, пункт меню первоначально отменяется. |
(в JCheckBoxMenuItem ) |
Набор или получает состояние выбора пункта меню флажка. |
|
Если параметром является истина, включите пункту меню. Иначе, отключите пункт меню. |
|
Установите мнемосхему, которая включает перемещению с помощью клавиатуры к пункту меню или пункту меню. Используйте одну из констант VK, определенных в KeyEvent class. |
|
Установите акселератор, который активирует пункт меню. |
|
Определите имя действия, выполняемого пунктом меню. |
|
Добавьте слушателя события пункта меню. См. События Обработки из Пунктов меню для деталей. |
|
Установите Action связанный с пунктом меню. См. |
Многие из предыдущих методов наследованы от AbstractButton . См. API Кнопки для информации о других полезных методах это AbstractButton обеспечивает. |
Меню используются в нескольких из наших примеров.
Пример | Где Описано | Примечания |
---|---|---|
MenuLookDemo |
Этот раздел (Создающий Меню) | Простой пример, который создает все виды меню кроме раскрывающихся меню, но не обрабатывает события из пунктов меню. |
MenuDemo |
Этот раздел (Обрабатывающий События из Пунктов меню) | Добавляет обработка событий к MenuLookDemo . |
PopupMenuDemo |
Этот раздел (Переводящий Раскрывающееся Меню в рабочее состояние) | Добавляют раскрывающиеся меню к MenuDemo . |
MenuGlueDemo |
Этот раздел (Настраивающий Расположение Меню) | Демонстрирует, как влиять на расположение меню, добавляя невидимые компоненты к строке меню. |
MenuLayoutDemo |
Этот раздел (Настраивающий Расположение Меню) | Меню поперечного открытия реализаций располагаются в вертикальной строке меню. |
MenuSelectionManagerDemo |
— | Добавляет обнаружение выделения к MenuDemo. Чтобы видеть эту функцию, щелкните по меню и затем переместите мышь через любой пункт меню или подменю. Однажды в секунду, текстовая область будет обновлена с информацией о в настоящий момент выделенном пункте меню, чтобы не быть перепутанной с пунктом меню, который в конечном счете выбирает пользователь. Этот демонстрационный пример использует значение по умолчанию MenuSelectionManager , который отслеживает состояние иерархии меню. |
ActionDemo |
Как Использовать Действия | Использование Action объекты реализовать пункты меню, которые копируют функциональность, обеспеченную кнопками на панели инструментов. |
Framework |
— | Переводит в рабочее состояние многократные идентичные фреймы, каждого с меню в его строке меню. |
InternalFrameDemo |
Как Использовать Внутренние рамки | Использует пункт меню, чтобы создать окна. |
См.