public class MainFrame extends JFrame {    private Menu menu;    public MainFrame() {
        init();
    }    public MainFrame(String string) {
        super(string);
        init();
    }    private void init() {
        setVisible(true);
        setPreferredSize(new Dimension(1000, 720));
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setResizable(true);
        setTitle("task");        menu = new Menu();
        menu.create(this);
        
        pack();
    }
}
public class Menu {    private JMenuBar menuBar;
    private JMenu mGame;
    private JMenu mHelp;
    private JMenu mInfo;
    private JMenuItem mIStart;
    private JMenuItem mIClose;
    private JMenuItem mIAbout;
    private JFrame j;    public Menu() {    }    public Menu(MainFrame aThis) {
        j = aThis;
    }    public void create(JFrame j) {
        menuBar = new JMenuBar();
        mGame = new JMenu("file");
        mHelp = new JMenu("Help");
        mInfo = new JMenu("Information");
        mIStart = new JMenuItem("开始");
        mIClose = new JMenuItem("关闭");
        mIAbout = new JMenuItem("关于");        mGame.add(mIStart);
        mGame.add(mIClose);
        mHelp.add(mIAbout);
        menuBar.add(mGame);
        menuBar.add(mInfo);
        menuBar.add(mHelp);
        j.setJMenuBar(menuBar);        mInfo.setEnabled(false);    }    public void mICloseActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(0);
    }
}现在是mainframe可以显示, 也有菜单栏,但是菜单项"关闭"不起作用...
我心里感觉到是有点问题, 但是却不知道怎么改.
在不把event事件方法移出Menu类的前提下, 怎么让'关闭'起作用?????????????

解决方案 »

  1.   

    mIClose.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent evt){
            System.exit(0);
        }
    });
    或者
    Action closeAction = new AbstractAction("关闭"){
        public void actionPerformed(ActionEvent e){
            System.exit(0);
        }
    };
    JMenuItem miClose = new JMenuItem(closeAction);
      

  2.   

    楼上正解。关键是要将Listener add到MenuItem上。
    另,注意到你有将菜单项和方法实现自动映射的意图,帮你做了一个父类,继承它就可以实现你的意图了
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.lang.reflect.Method;import javax.swing.JMenuItem;public class MultiNameActionAdapter implements ActionListener{ public MultiNameActionAdapter() {
    super();
    } @Override
    public void actionPerformed(ActionEvent e) {
            JMenuItem source = (JMenuItem)(e.getSource());
            try {
    Method method = Menu.class.getMethod(source.getName()+
    "ActionPerformed", new Class[]{ActionEvent.class});
    method.invoke(this, e);
    } catch (Exception e2) {
    e2.printStackTrace();
    }
    }}
    然后修改你的Menu类代码如下,红色字体表示修改处,改动不多,其他菜单项可如法扩展
    public class Menu extends MultiNameActionAdapter { private JMenuBar menuBar;
    private JMenu mGame;
    private JMenu mHelp;
    private JMenu mInfo;
    private JMenuItem mIStart;
    private JMenuItem mIClose;
    private JMenuItem mIAbout;
    private JFrame j; public Menu() {
    } public void create(JFrame j) {
    menuBar = new JMenuBar();
    mGame = new JMenu("file");
    mHelp = new JMenu("Help");
    mInfo = new JMenu("Information");
    mIStart = new JMenuItem("开始");
    mIClose = new JMenuItem("关闭");
    mIClose.setName("mIClose");
    mIClose.addActionListener(this);
    mIAbout = new JMenuItem("关于");
    mGame.add(mIStart);
    mGame.add(mIClose);
    mHelp.add(mIAbout);
    menuBar.add(mGame);
    menuBar.add(mInfo);
    menuBar.add(mHelp);
    j.setJMenuBar(menuBar); mInfo.setEnabled(false); } public void mICloseActionPerformed(java.awt.event.ActionEvent evt) {
    System.exit(0);
    }
    }