这句:b1.addActionListener(new MyeventAdd(this));//这里为什么传this,this代表上面,为什么传mtf就错package javagui;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TestMath { public static void main(String[] args) {
new MyFrameMath().MYMath();
}
}
class MyFrameMath extends Frame{
TextField tf1,tf2,tf3;
public void MYMath(){
tf1 = new TextField(10);
tf2 = new TextField(10);
tf3 = new TextField(15);
Label l = new Label("+");
Button b1 = new Button("=");
setLayout(new FlowLayout());
add(tf1);
add(l);
add(tf2);
add(b1);
add(tf3);
setResizable(false);
pack();
MyFrameMath mtf = new MyFrameMath();
b1.addActionListener(new MyeventAdd(this));//这里为什么传this,this代表上面,为什么传mtf就错呢?
setVisible(true);
}
}
class MyeventAdd implements ActionListener{
MyFrameMath mtf =null;

public MyeventAdd(MyFrameMath mtf){
this.mtf = mtf;
}

public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(mtf.tf1.getText());
int n2 = Integer.parseInt(mtf.tf2.getText());
mtf.tf3.setText(String.valueOf(n1+n2));
}
}

解决方案 »

  1.   

     b1.addActionListener(new MyeventAdd(this));
    this指的是MyFrameMath对象
     
    因为按钮b1属于当前的MyFrameMath,增加监听的时候只能传入b1所属MyFrameMath
    如果你传入的是一个新的MyFrameMath对象就和按钮b1没有关系,无法实现监听
      

  2.   

    那下面的构造方法接收的是什么?MyFrameMath mtf =null;

    public MyeventAdd(MyFrameMath mtf){
    this.mtf = mtf;
    }
      

  3.   

    在你的MyeventAdd方法的参数是Frame对象,是为了给参数指定的Frame对象添加事件监听器,当然在MyFrameMath类中调用MyeventAdd方法时要传递当前对象,而this指的就是MyFrameMath自身,所以传递的参数是this,mtf只是MyFrameMath类的一个实例化对象,与this并不是一码事。
    这是我的理解。
      

  4.   

    因为在添加监听时传入的是MyFrameMath 本身,你重新new了一个新的对象,就监听不到事件源了。