Как определить, был ли нажат пункт меню

как указано в заголовке, мне нужно знать, как определить, был ли нажат пункт меню или нет, а затем запустить связанную функцию. например, у меня есть JMenu с "выходом" JMenuItem, который при нажатии должен запускать метод закрытия формы.

import javax.swing.*;

public class selector_form extends JFrame {


/**
 * 
 */
private static final long serialVersionUID = -5963842156289770842L;

public selector_form(String name)
{
    super.setTitle(name);
    setupComponents(this);
    super.setVisible(true);

}

private void setupComponents(JFrame frame)
{

    JMenuItem file_items = new JMenuItem("Exit");
    JMenuItem config_items = new JMenuItem("Preferences");
    JMenuItem[] machine_items = {new JMenuItem("Refresh"), 
            new JMenuItem("Add Dynamically"), new JMenuItem("Remove Dynamically")
    };
    JMenuItem[] emulator_items = {new JMenuItem("Start Emulator"),
            new JMenuItem("Stop Emulator"), new JMenuItem("Pause Emulator"),
            new JMenuItem("Reset Emulator"), new JMenuItem("Crash Emulator")
    };
    JMenuItem[] memory_items = {new JMenuItem("View Emulator Memory"),
            new JMenuItem("System Cheats"), new JMenuItem("Dump Emulator Memory"),
            new JMenuItem("Edit Specific Address"), 
            new JMenuItem("Show Allocations"), new JMenuItem("Allocate Memory"),
            new JMenuItem("DeAllocate Memory")
    };
    JMenuItem[] cpu_items = {new JMenuItem("Show Host Specs"),
            new JMenuItem("Show Emulator Specs"), 
            new JMenuItem("Enable HyperThreadding")
    };
    JMenuItem[] about_items = {new JMenuItem("Help Contents"), 
            new JMenuItem("About")
    };

    frame.setSize(800, 600);

    JMenuBar jmb = new JMenuBar();
    JMenu jm_a = new JMenu("File");
    JMenu jm_c = new JMenu("Config");
    JMenu jm_d = new JMenu("Machines");
    JMenu jm_e = new JMenu("Emulator");
    JMenu jm_f = new JMenu("Memory");
    JMenu jm_g = new JMenu("CPU");
    JMenu jm_h = new JMenu("About");

    jm_a.add(file_items);
    jm_c.add(config_items);
    for(JMenuItem item : machine_items)
        jm_d.add(item);
    for(JMenuItem item : emulator_items)
        jm_e.add(item);
    for(JMenuItem item : memory_items)
        jm_f.add(item);
    for(JMenuItem item : cpu_items)
        jm_g.add(item);
    for(JMenuItem item : about_items)
        jm_h.add(item);

    jmb.add(jm_a);
    jmb.add(jm_c);
    jmb.add(jm_d);
    jmb.add(jm_e);
    jmb.add(jm_f);
    jmb.add(jm_g);
    jmb.add(jm_h);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

    frame.setJMenuBar(jmb);

}

}

person 7c00h    schedule 19.11.2012    source источник
comment
Вы действительно хотите знать, когда на нее нажали? Как правило, вас не должно волновать, какое взаимодействие с пользователем запускает меню (может быть выбор по клавише, например). И, как правило, элементы настраиваются с помощью _Action_s, которые запускают все, что необходимо сделать, см. Учебник, указанный в вики тега свинга.   -  person kleopatra    schedule 19.11.2012
comment
что я подразумеваю под этим, скажем, например, я делал firefox, например, и мне нужно знать, нажал ли пользователь кнопку добавления вкладки. это просто пример.   -  person 7c00h    schedule 19.11.2012


Ответы (3)


Вы можете сделать это с помощью ActionListener. Вы можете создать свой собственный класс ActionListener.

class MenuActionListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    System.out.println("Selected: " + e.getActionCommand());    
  }
}

Затем добавьте его в JMenuItem.

JMenuItem newMenuItem = new JMenuItem("New");
newMenuItem.addActionListener(new MenuActionListener());
person totymedli    schedule 19.11.2012

Просто добавьте к нему ActionListener.

menu_item.addActionListener(this);

и реализовать интерфейс ActionListener.

person Sri Harsha Chilakapati    schedule 19.11.2012
comment
на самом деле, это не лучший подход (@totymedi также) - общее правило состоит в том, чтобы всегда использовать самую высокую доступную абстракцию, которая является действием - person kleopatra; 19.11.2012

Спасибо за ответы на все вопросы. вот что я сделал.

я использовал пример totymedli и написал класс под названием MenuActionHelper, который вызывает специальный класс MenuEventHandler, который передает идентификатор функции, которая вызывает необходимую функцию.

обновленная форма выбора:

package application;


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

import javax.swing.*;

public class selector_form extends JFrame {

public static MenuEventHandler mehandler;
/**
 * 
 */
private static final long serialVersionUID = -5963842156289770842L;

public selector_form(String name)
{
    super.setTitle(name);
    setupComponents(this);
    super.setVisible(true);
    mehandler = new MenuEventHandler(this);

}

private void setupComponents(JFrame frame)
{

    JMenuItem file_items = new JMenuItem("Exit");
    JMenuItem config_items = new JMenuItem("Preferences");
    JMenuItem[] machine_items = {new JMenuItem("Refresh"), 
            new JMenuItem("Add Dynamically"), new JMenuItem("Remove Dynamically")
    };
    JMenuItem[] emulator_items = {new JMenuItem("Start Emulator"),
            new JMenuItem("Stop Emulator"), new JMenuItem("Pause Emulator"),
            new JMenuItem("Reset Emulator"), new JMenuItem("Crash Emulator")
    };
    JMenuItem[] memory_items = {new JMenuItem("View Emulator Memory"),
            new JMenuItem("System Cheats"), new JMenuItem("Dump Emulator Memory"),
            new JMenuItem("Edit Specific Address"), 
            new JMenuItem("Show Allocations"), new JMenuItem("Allocate Memory"),
            new JMenuItem("DeAllocate Memory")
    };
    JMenuItem[] cpu_items = {new JMenuItem("Show Host Specs"),
            new JMenuItem("Show Emulator Specs"), 
            new JMenuItem("Enable HyperThreadding"), 
            new JMenuItem("Show Disassembly in real time")
    };
    JMenuItem[] about_items = {new JMenuItem("Help Contents"), 
            new JMenuItem("About")
    };

    frame.setSize(800, 600);

    JMenuBar jmb = new JMenuBar();
    JMenu jm_a = new JMenu("File");
    JMenu jm_c = new JMenu("Config");
    JMenu jm_d = new JMenu("Machines");
    JMenu jm_e = new JMenu("Emulator");
    JMenu jm_f = new JMenu("Memory");
    JMenu jm_g = new JMenu("CPU");
    JMenu jm_h = new JMenu("About");

    jm_a.add(file_items);
    jm_c.add(config_items);
    for(JMenuItem item : machine_items)
        jm_d.add(item);
    for(JMenuItem item : emulator_items)
        jm_e.add(item);
    for(JMenuItem item : memory_items)
        jm_f.add(item);
    for(JMenuItem item : cpu_items)
        jm_g.add(item);
    for(JMenuItem item : about_items)
        jm_h.add(item);

    jmb.add(jm_a);
    jmb.add(jm_c);
    jmb.add(jm_d);
    jmb.add(jm_e);
    jmb.add(jm_f);
    jmb.add(jm_g);
    jmb.add(jm_h);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

    frame.setJMenuBar(jmb);

    //Menu Action Helpers
    file_items.addActionListener(new MenuActionHelper(1));

}

}

/* EFFECTIVE ACTIONLISTENER
 * 
 * passes an integral argument to MeunEventHandler
 */

class MenuActionHelper implements ActionListener
{

public static int digitalIdentifier;

public MenuActionHelper(int i)
{
    MenuActionHelper.digitalIdentifier = i;
}
@Override
public void actionPerformed(ActionEvent arg0) 
{
    try
    {
        if(!(selector_form.mehandler.parseEvent(MenuActionHelper.digitalIdentifier)))
        {
            throw new Exception("Invalid Menu Event ID Parsed!");
        }
        else return;
    }catch(Exception e)
    {
        e.printStackTrace();
    }

}

}

и новый класс MenuEventHandler:

package application;

import javax.swing.JFrame;

public class MenuEventHandler {

/* have a static number which is the max an id can be */
public static final int maxActionId = 1000; //good large number

public static JFrame frame;

public MenuEventHandler(JFrame frame) //import jframe functionality
{
    MenuEventHandler.frame = frame;
}

public boolean parseEvent(int i)
{
    boolean success = false;

    switch(i)
    {
    case 1:
    {
        MenuEventHandler.frame.dispose();
        success = true;
    }
    break;
    }
    return success;
}
}

теперь, если кто-то нажмет на выход MenuItem, форма закроется и приложение завершится.

person 7c00h    schedule 19.11.2012