java的getSource()方法

来源:百度知道 编辑:UC知道 时间:2024/07/01 14:10:14
本人看JAVA基础与应用程序时书上有这样一个程序import java.awt.*;
import java.awt.event.*;

public class frame extends Frame implements ActionListener
{
Button btn=new Button("退出");
public frame()
{
btn.setBackground(Color.orange);
btn.setForeground(Color.RED);
add(btn);
setVisible(true);
pack();
btn.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btn)
{
System.exit(0);
}
}// TODO Auto-generated method stub
public static void main(String args[])
{
frame smp=new frame();
}
}
按书上说单击"退出"后即可退出,可是运行了半天也不行,怎么关也关不掉,后来直接把if(e.getSource()==btn)删掉却可以正常点机退出了,是书上错了呢,还是怎么回事呢,那getSource到底是怎么用的呢,请大虾指教!

ActionEvent 的 getSource() 继承自 EventObject;

getSource
public Object getSource()
最初发生 Event 的对象。

返回:
最初发生 Event 的对象。

你的例子中。把if(e.getSource()==btn) 去掉可行,因为你的例子中只有一个button。
如果你有两个button,还有一个btn2,且都addActionListener的话。
必须要用上e.getSource()来区分响应哪个button了
if(e.getSource()==btn)
//todo btn
else if(e.getSource()==btn2)
//todo btn

个人感觉不是e.getSource()的错。有个建议,不一定是这个原因。
e.getSource()返回的是Object,将Object强制转换为Button试试

在我这里没有出现任何错误, 点击"退出" 就可以退出.

因为你使用的事件触发方式是实现ActionListener接口, 然后在事件触发方法中, 判断事件源来进行功能分类的, getSource是判断这个事件是由哪个组件发出的, 如果是btn这个按钮发出的, 就退出系统, 如果不是btn发出的, 就不执行操作, 这里之后一个按钮注册了ActionListener, 所以效果不明显, 如果你再为另外一个按钮注册ActionListener的话(比如加一个最大化的功能按钮), 就要用getSource来区分产生事件的按钮, 然后来区分执行的功能了.
下面的代码增加了最大化:

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.ActionEvent;
impo