Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11700
Последний выпуск: 19.06.2015

Обработка событий меню через ID пунктов

33K
06 мая 2014 года
mnanorn
75 / / 01.12.2013
Здравствуйте!

Раз:
 
Код:
package anarok;

public class anarok
{
    public static void main(String[] args)
    {  
        AnarokWindow awMainWindow = new AnarokWindow("Main Frame");
    }
}
Два:

Код:
package anarok;

import java.awt.*;
import java.awt.event.*;

class AnarokWindow extends Frame
{
    public AnarokWindow(String sCaption)
    {
        super(sCaption);
       
        this.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
       
        MenuListener mlAction = new MenuListener();
       
        //Создание меню
        MenuBar mbMainMenu = new MenuBar();         //Новая строка меню
       
        Menu mFile = new Menu("File");              //Создать меню "File"
        mFile.addActionListener(mlAction);
        Menu mEdit = new Menu("Edit");              //Создать меню "Edit"
        mEdit.addActionListener(mlAction);
        Menu mAbout = new Menu("About");            //Создать меню "About"
        mAbout.addActionListener(mlAction);
       
        //Пункты меню File
        MenuItem miNew = new MenuItem("New");
        MenuItem miSave = new MenuItem("Save");
        MenuItem miSaveAs = new MenuItem("Save as...");
        MenuItem miOpen = new MenuItem("Open");
        MenuItem miClose = new MenuItem("Close");
        MenuItem miExit = new MenuItem("Exit");
       
        //Пункты меню About
        MenuItem miAbout = new MenuItem("О программе...");
       
        //Добавить пункты в меню File
        mFile.add(miNew);
        mFile.addSeparator();
        mFile.add(miSave);
        mFile.add(miSaveAs);
        mFile.addSeparator();
        mFile.add(miOpen);
        mFile.add(miClose);
        mFile.addSeparator();
        mFile.add(miExit);
       
        //Добавить пункты в меню About
        mAbout.add(miAbout);
       
        //Прикрепить меню к строке меню
        mbMainMenu.add(mFile);
        mbMainMenu.add(mEdit);
        mbMainMenu.add(mAbout);
       
        this.setMenuBar(mbMainMenu);                //Установить окну строку меню
       
        this.setBounds(100, 100, 500, 300);         //Установить размеры окна
        this.setVisible(true);                      //Показать окно
    }
}
Три:

Код:
package anarok;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class MenuListener implements ActionListener
{
    public void actionPerformed (ActionEvent e)
    {
        System.out.println(e.getID());
    }
}
Пощелкайте пункты и убедитесь, что ID пунктов везде 1001. Хочется обрабатывать события по ID, а не getActionCommand().
Причины:
  1. программа может быть локализирована под разные языки;
  2. getActionCommand() требует сравнения строк, что "дороже" сравнения чисел.
Каждый раз перебирать ActionCommand - это странно, как я думаю.
В WinAPI при создании меню можно явно указать ID пунктов. Как делать здесь?

Есть вариант:

 
Код:
class XXXItemListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //Действие для пункта XXX
    }
}
где XXX - имя конкретного пункта. Сколько пунктов, столько классов-обработчиков. Это - нормально выглядит или грабли?

Спасибо за внимание.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог