Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Меню
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Меню

Меню обеспечивает экономящий место способ позволить пользователю выбирать одну из нескольких опций. Другие компоненты, с которыми пользователь может сделать выбор "один из многих", включают поля комбинированного списка, списки, переключатели, прядильщиков, и панели инструментов. Если какой-либо из Ваших пунктов меню выполняет действие, которое дублируется другим пунктом меню или кнопкой на панели инструментов, то в дополнение к этому разделу следует читать, Как Использовать Действия.

Меню уникальны в этом, условно, они не размещаются с другими компонентами в UI. Вместо этого меню обычно появляется или в строке меню или как раскрывающееся меню. Строка меню содержит одно или более меню и имеет общепринятое, зависимое от платформы расположение — обычно вдоль вершины окна. Раскрывающееся меню является меню, которое невидимо, пока пользователь не делает специфичное для платформы действие мыши, такое как нажатие правой кнопки мыши, по раскрывающемуся поддерживающему компоненту. Раскрывающееся меню тогда появляется под курсором.

Следующие данные показывают много связанных с меню компонентов: строка меню, меню, пункты меню, пункты меню переключателя, пункты меню флажка, и разделители. Как можно видеть, у пункта меню могут быть или изображение или текст, или оба. Можно также определить другие свойства, такие как шрифт и цвет.

MenuLookDemo

Остальная часть этого раздела учит Вас компонентам меню и говорит Вам, как использовать различные функции меню:

Иерархия компонентов Меню

Вот изображение иерархии наследования для связанных с меню классов:

Иерархия наследования для классов меню

Поскольку данные показывают, пункты меню (включая меню) являются просто кнопками. Вы могли бы задаваться вопросом, как меню, если это - только кнопка, показывает свои пункты меню. Ответ - то, что, когда меню активируется, оно автоматически переводит в рабочее состояние раскрывающееся меню, которое выводит на экран пункты меню.

Создание Меню

Следующий код создает меню, показанные около начала этого раздела меню. Полужирные строки кода создают и соединяют объекты меню; другие кодовые наборы или настраивают объекты меню. Можно найти всю программу в 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, можно прислушаться или к событиям действия или к событиям элемента, как описано в том, Как Использовать Переключатели. Для JCheckBoxMenuItems, Вы обычно прислушиваетесь к событиям элемента, как описано в том, Как Использовать Флажки.


Попробуйте это: 
Текстовая область показывает действию и событиям элемента наших обнаруженных слушателей.

Вот код, который реализует обработку событий:

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 (с или без Высокого звука) заставляет второй пункт меню быть выбранным. Пункт меню обычно выводит на экран свою мнемосхему, подчеркивая первое возникновение мнемонического символа в тексте пункта меню как следующие шоу снимка.

B является мнемоническим символом для этого пункта меню

Акселератор является сочетанием клавиш, которое заставляет пункт меню быть выбранным, видимо ли это. Например, нажимая Высокий звук и 2 ключа MenuDemo заставляет первый элемент в подменю первого меню быть выбранным, не переводя меню в рабочее состояние. Только листовые пункты меню — у меню, которые не переводят другие меню в рабочее состояние — могут быть акселераторы. Следующий снимок показывает, как стиль Java выводит на экран пункт меню, у которого есть акселератор.

Alt+2 рекламирует акселератор этого пункта меню

Можно определить мнемосхему или создавая пункт меню или с 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 постоянное соответствие ключу пользователь должно нажать. Чтобы определить акселератор, следует использовать a KeyStroke объект, который комбинирует ключ (определенный a 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:

MenuGlueDemo

Другой способ изменить вид меню состоит в том, чтобы изменить менеджеров по расположению, используемых, чтобы управлять ими. Например, можно изменить менеджера по расположению строки меню от значения по умолчанию слева направо BoxLayout к чему-то такой как GridLayout.


Попробуйте это: 

Вот является изображение расположения меню этим MenuLayoutDemo создает:

MenuLayoutDemo

API Меню

Следующие таблицы приводят обычно используемых конструкторов меню и методы. API для того, чтобы использовать меню попадает в эти категории:

Создание и Установка Строк меню
Конструктор или Метод Цель
JMenuBar () Создает строку меню.
JMenu добавляют (JMenu) Добавляет меню до конца строки меню.
освободите setJMenuBar (JMenuBar)
JMenuBar getJMenuBar ()
JApplet, JDialog, JFrame, JInternalFrame, JRootPane)
Наборы или получают строку меню апплета, диалогового окна, фрейма, внутренней рамки, или корневой области.
Создание и Заполнение Меню
Конструктор или Метод Цель
JMenu ()
JMenu (Строка)
JMenu (Действие)
Создает меню. Строка определяет текст, чтобы вывести на экран для меню. Action определяет текст и другие свойства меню (см., Как Использовать Действия).
JMenuItem добавляют (JMenuItem)
JMenuItem добавляют (Строка)
Добавляет пункт меню к текущему концу меню. Если параметром является строка, то меню автоматически создает a JMenuItem возразите, что выводит на экран указанный текст. Примечание версии: Прежде 1.3, единственный способ связаться Action с пунктом меню должен был использовать меню add(Action) метод, чтобы создать пункт меню и добавить это к меню. С 1.3, больше не рекомендуется тот метод. Можно вместо этого связать пункт меню с Action использование setAction метод.
освободите addSeparator () Добавляет разделитель к текущему концу меню.
JMenuItem вставляют (JMenuItem, интервал)
пустая вставка (Строка, интервал)
освободите insertSeparator (интервал)
Вставляет пункт меню или разделитель в меню в указанной позиции. Первый пункт меню в позиции 0, втором в позиции 1, и так далее. JMenuItem и String параметры обрабатываются то же самое как в соответствии add методы.
пусто удалите (JMenuItem)
пусто удалите (интервал)
освободите removeAll ()
Удаляет указанный элемент (ы) из меню. Если параметром является целое число, то он определяет позицию пункта меню, который будет удален.
Создание, Заполняя, и Управляя Раскрывающимися Меню
Конструктор или Метод Цель
JPopupMenu ()
JPopupMenu (Строка)
Создает раскрывающееся меню. Дополнительный строковый параметр определяет title, который стиль мог бы вывести на экран как часть всплывающего окна.
JMenuItem добавляют (JMenuItem)
JMenuItem добавляют (Строка)
Добавляет пункт меню к текущему концу раскрывающегося меню. Если параметром является строка, то меню автоматически создает a JMenuItem возразите, что выводит на экран указанный текст. Примечание версии: Прежде 1.3, единственный способ связаться Action с элементом в раскрывающемся меню должен был использовать раскрывающееся меню add(Action) метод, чтобы создать пункт меню и добавить это к раскрывающемуся меню. С 1.3, больше не рекомендуется тот метод. Можно вместо этого связать пункт меню с Action использование setAction метод.
освободите addSeparator () Добавляет разделитель к текущему концу раскрывающегося меню.
пустая вставка (Компонент, интервал) Вставляет пункт меню в меню в указанной позиции. Первый пункт меню в позиции 0, втором в позиции 1, и так далее. Component параметр определяет пункт меню, чтобы добавить.
пусто удалите (интервал)
освободите removeAll ()
Удаляет указанный элемент (ы) из меню. Если параметром является целое число, то он определяет позицию пункта меню, который будет удален.
статическая пустота setLightWeightPopupEnabled (булев) По умолчанию Swing реализует окно меню, используя легкий компонент. Это может вызвать проблемы, если Вы используете какие-либо тяжелые компоненты в своей программе Swing, как описано в Переводе в рабочее состояние Раскрывающегося Меню. (Это - одна из нескольких причин избегать использования тяжелых компонентов.) Как обходное решение, вызвать JPopupMenu.setLightWeightPopupEnabled(false).
освободите шоу (Компонент, интервал, интервал) Выведите на экран раскрывающееся меню в указанном x, y позиция (определенный в том порядке целочисленными параметрами) в системе координат указанного компонента.
Реализация Пунктов меню
Конструктор или Метод Цель
JMenuItem ()
JMenuItem (Строка)
JMenuItem (Значок)
JMenuItem (Строка, Значок)
JMenuItem (Строка, интервал)
JMenuItem (Действие)
Создает обычный пункт меню. Параметр значка, если есть определяет значок, который должен вывести на экран пункт меню. Точно так же строковый параметр определяет текст, который должен вывести на экран пункт меню. Целочисленный параметр определяет мнемосхему клавиатуры, чтобы использовать. Можно определить любую из соответствующих констант VK, определенных в KeyEvent class. Например, чтобы определить ключ, использовать KeyEvent.VK_A.

Конструктор с Action параметр, который был представлен в 1.3, устанавливает пункт меню Action, то, чтобы заставлять свойства пункта меню быть инициализированным от Action. См., Как Использовать Действия для деталей.

JCheckBoxMenuItem ()
JCheckBoxMenuItem (Строка)
JCheckBoxMenuItem (Значок)
JCheckBoxMenuItem (Строка, Значок)
JCheckBoxMenuItem (Строка, булева)
JCheckBoxMenuItem (Строка, Значок, булев)
Создает пункт меню, который смотрит и действует как флажок. Строковый параметр, если таковые вообще имеются, определяет текст, который должен вывести на экран пункт меню. Если Вы определяете true для булева параметра тогда пункт меню первоначально выбирается (проверенный). Иначе, пункт меню первоначально отменяется.
JRadioButtonMenuItem ()
JRadioButtonMenuItem (Строка)
JRadioButtonMenuItem (Значок)
JRadioButtonMenuItem (Строка, Значок)
JRadioButtonMenuItem (Строка, булева)
JRadioButtonMenuItem (Значок, булев)
JRadioButtonMenuItem (Строка, Значок, булев)
Создает пункт меню, который смотрит и действует как переключатель. Строковый параметр, если таковые вообще имеются, определяет текст, который должен вывести на экран пункт меню. Если Вы определяете true для булева параметра тогда первоначально выбирается пункт меню. Иначе, пункт меню первоначально отменяется.
освободите (булев) setState
булев getState ()
JCheckBoxMenuItem)
Набор или получает состояние выбора пункта меню флажка.
освободите (булев) setEnabled Если параметром является истина, включите пункту меню. Иначе, отключите пункт меню.
освободите setMnemonic (интервал) Установите мнемосхему, которая включает перемещению с помощью клавиатуры к пункту меню или пункту меню. Используйте одну из констант VK, определенных в KeyEvent class.
освободите setAccelerator (Нажатие клавиши) Установите акселератор, который активирует пункт меню.
освободите setActionCommand (Строка) Определите имя действия, выполняемого пунктом меню.
освободите addActionListener (ActionListener)
освободите addItemListener (ItemListener)
Добавьте слушателя события пункта меню. См. События Обработки из Пунктов меню для деталей.
освободите setAction (Действие) Установите Action связанный с пунктом меню. См., Как Использовать Действия для деталей.
Многие из предыдущих методов наследованы от AbstractButton. См. API Кнопки для информации о других полезных методах это AbstractButton обеспечивает.

Примеры то Использование Меню

Меню используются в нескольких из наших примеров.

Пример Где Описано Примечания
MenuLookDemo Этот раздел (Создающий Меню) Простой пример, который создает все виды меню кроме раскрывающихся меню, но не обрабатывает события из пунктов меню.
MenuDemo Этот раздел (Обрабатывающий События из Пунктов меню) Добавляет обработка событий к MenuLookDemo.
PopupMenuDemo Этот раздел (Переводящий Раскрывающееся Меню в рабочее состояние) Добавляют раскрывающиеся меню к MenuDemo.
MenuGlueDemo Этот раздел (Настраивающий Расположение Меню) Демонстрирует, как влиять на расположение меню, добавляя невидимые компоненты к строке меню.
MenuLayoutDemo Этот раздел (Настраивающий Расположение Меню) Меню поперечного открытия реализаций располагаются в вертикальной строке меню.
MenuSelectionManagerDemo Добавляет обнаружение выделения к MenuDemo. Чтобы видеть эту функцию, щелкните по меню и затем переместите мышь через любой пункт меню или подменю. Однажды в секунду, текстовая область будет обновлена с информацией о в настоящий момент выделенном пункте меню, чтобы не быть перепутанной с пунктом меню, который в конечном счете выбирает пользователь. Этот демонстрационный пример использует значение по умолчанию MenuSelectionManager, который отслеживает состояние иерархии меню.
ActionDemo Как Использовать Действия Использование Action объекты реализовать пункты меню, которые копируют функциональность, обеспеченную кнопками на панели инструментов.
Framework Переводит в рабочее состояние многократные идентичные фреймы, каждого с меню в его строке меню.
InternalFrameDemo Как Использовать Внутренние рамки Использует пункт меню, чтобы создать окна.

См. Использование JavaFX Средства управления UI: учебное руководство по Меню, чтобы изучить, как создать меню в JavaFX.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Списки
Следующая страница: Как Использовать Панели