读书人

初学者有关问题:JMenuItem用内部类ge

发布时间: 2012-01-31 21:28:41 作者: rapoo

菜鸟问题:JMenuItem用内部类getSource监听不到
我准备让所有JMenuItem用menuHandler这个内部类进行监听,然后在内部类中用getSource区分对象,但是没有响应(其他对象可以但MenuItem就是没有反应),而如果用getActionCommand()=="Exit"话则可以,原因是什么?

先谢谢了

部分代码如下(仅表现退出功能):

public class Swpr extends JFrame{
JMenuItem exitItem;
public Swpr(){
MenuHandler menuHandler = new MenuHandler();
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK));
exitItem.addActionListener( menuHandler );
gMenu.add(exitItem);

JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
bar.add(gMenu);
}

private class MenuHandler implements ActionListener{
public void actionPerformed (ActionEvent e){
if (e.getSource()==exitItem){
if (JOptionPane.showConfirmDialog(Swpr.this, "Confirm exit?", "" , JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)==0)
System.exit(0);
}

}
}


[解决办法]
public class Swpr extends JFrame{
JMenuItem exitItem;
public Swpr(){
MenuHandler menuHandler = new MenuHandler();
//exitItem 已经在外面声明了,你试试可以不
exitItem = new JMenuItem("Exit");
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK));
exitItem.addActionListener( menuHandler );
gMenu.add(exitItem);

JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
bar.add(gMenu);
}

private class MenuHandler implements ActionListener{
public void actionPerformed (ActionEvent e){
if (e.getSource()==exitItem){
if (JOptionPane.showConfirmDialog(Swpr.this, "Confirm exit?", "" , JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)==0)
System.exit(0);
}

}
}

[解决办法]
JMenuItem exitItem对象你定义了两次,成员变量一次,这里仅仅是定义了一个引用,构造器里面又重新定义了一个,这时候该引用指向一个JMenuItem对象
将构造器中定义exitItem的类说明删去即可,改为:exitItem = new JMenuItem("Exit");

读书人网 >J2SE开发

热点推荐