addActionListener(this) 中的this问题

public class JP extends JFrame implements ActionListener{
JPanel panel1=new JPanel();
.........................
panel2.add(A=new JButton("7"));
................................
A.addActionListener(this);
..........
}
1.这个this是调用当前对象?

2.如果我不想用“this” 可以换成什么?(这个是为了更深入的了解this,请仔细回答,谢谢)

this是当前对象,先不谈this可以换成什么,先谈谈这里的this干什么用的。

首先A.addActionListener(this);的作用就是给A加个监听器,所谓监听器其实就是一个普通类,只不过这个类有一个特别的方法而已,也就是ActionListener要求必须实现的方法。
当A发生事件的时候会调用监听器中定义的那个方法。

所以this在这里的作用就是提供了一个可以被调用的方法而已,你当然可以不用this用其他类的对象,只要这个对象实现了ActionListener接口,也就是写了ActionListener规定的方法。

一般我们开发时会专门写一些处理事件的类,比如你可以定义一个AButtonActionListener,专门处理A发生的事件,这样的话就可以:

A.addActionListener(new AButtonActionListener() );
当然,上面只是个例子,具体如何用要看你想做什么了。追问

你说的好,但还是没有解决我关于this的疑问、、就我这个程序来说 他到底能换成什么呢 不是new JP() 我觉得二楼说的指针有道理,这个指针指向一个我还没有创建的JP对象,所以这里应该只能用this我个人认为,不知你是否同意?

追答

我刚才不是说了么?希望你仔细看看:
你当然可以不用this用其他 类 的对象,只要这个对象实现了ActionListener接口,也就是写了ActionListener规定的方法。一般我们开发时会专门写一些处理事件的类,比如你可以定义一个AButtonActionListener,专门处理A发生的事件。

我实在搞不明白为什么你说这里只能用this,除非你不想改代码结构,也就是不想创建一个专门处理A事件的类。

我也听不明白你的话“ 我觉得二楼说的指针有道理,这个指针指向一个我还没有创建的JP对象”,this“指向一个我还没有创建的JP对象”??那还真搞笑了,this本身就是指向自己,注意这个自己是自己这个对象,而不仅仅是JP类,也就是调用A.addActionListener(this)所依赖的那个对象。

你如果还不理解this的话,我建议你先好好学学Java的类与对象。

我怀疑解释半天你还是不明白,给你代码吧,这是我测试过的,没有错误!:

//===============窗体===========
public class JP extends JFrame {

public JP() {
this.setSize(400, 300);
JPanel panel = new JPanel();

JButton a = new JButton("7");
a.addActionListener(new AButtonActionListener());
panel.add(a);
this.add(panel);

}

public static void main(String[] args) {
JP jp = new JP();
jp.setVisible(true);

}

}

//======事件处理类=======================

public class AButtonActionListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {

System.out.println("JButton");

}

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-30
(1)是当前对象。也就是JP这个类的一个实例。
你这个A不能在下面这行掉用,因为是一个局部变量,应该这样写才行,JButton = A=new JButton("7"); panel2.add(A);A.addActionListener(this);
(2)如果不想用this,可以这样写。A.addActionListener(new ActionListener() {
//在中间实现那个要实现的方法
})
其实this,要说用也用得也不是很多,因为基本都隐藏了。就是说就是在每个调用的方法钱没有具体的对象,其实前面就是隐藏了一个this指针了,也就是指向当前对象的指针。追问

A.addActionListener(new ActionListener() {
//在中间实现那个要实现的方法
})
你这个用的是匿名内部类是吧?但是我已经用JP实现了 ActionListener这个接口了不是么 我再用一个匿名内部类再实现一个ActionListener会不会出现问题?你说的指针我很赞成,不知你能否再仔细解释一下?谢谢!

追答

使用内部类不会有问题的,我以前就是这样写的。你试试吧。。。。

第2个回答  2011-06-30
panel2.add(JButton A=new JButton("7"));//
A.addActionListener(this);
给按钮添加监听器,这里this指的是当前类JP,应为JP实现了 ActionListener接口,所以可以直接添加此类,若不想使用this,可换为new JP()追问

换成new JP()是不对的,并不是这么简单。。。二楼说的指针有道理,这个指针指向一个我还没有创建的JP对象,所以这里应该只能用this我个人认为,不知你是否同意?

追答

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JP extends JFrame implements ActionListener {
public static void main(String[] args) {
JP jp = new JP();
JPanel panel = new JPanel();

JButton A = new JButton("7");
panel.add(A);

A.addActionListener(new JP());
jp.setContentPane(panel);
jp.pack();
jp.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("你好!");
}

}
测试过的

第3个回答  2011-06-30
this就是指的对象本身嘛,换成A试试追问

饿。。你说的不对 不是A 如果说可能的话 也应该是JP(也并不是单纯的JP)。 是JP实现了 ActionListener这个接口

本回答被提问者采纳