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类的前提下, 怎么让'关闭'起作用?????????????
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类的前提下, 怎么让'关闭'起作用?????????????
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);
另,注意到你有将菜单项和方法实现自动映射的意图,帮你做了一个父类,继承它就可以实现你的意图了
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);
}
}