java 监听器遇到了一个非常奇怪的问题

来源:百度知道 编辑:UC知道 时间:2024/06/01 17:45:41
问题出在地下处理动作的actionPerformed上
我就奇怪了,原来我都这么用,书上的例子也这么写的,怎么这次就死活不行了呢?
public class WinTable1 extends JFrame implements ActionListener{

protected WinTable1(){
super("学生成绩管理系统");
setVisible(true);
setSize(650,180);
Container con=getContentPane();
con.setLayout(new FlowLayout());
JTable table = new JTable(0,0);
JLabel num,name,answer;
JTextField Tnum,Tname,Tanswer;
num=new JLabel("按学号查询:");
name=new JLabel("按姓名查询:");
answer=new JLabel("查询结果:");
Tnum=new JTextField(12);
Tname=new JTextField(12);
Tanswer=new JTextField(30);
Tnum.addActionListener(this);
Tname.addActionListener(this);
Tanswer.addActionListener(this);
con.add(num,BorderLayout.SOUTH);con.add(Tnum,BorderLayout.SOUTH

Tname 是在构造方法体中声明的, 所以可以调用的范围只是构造方法中, 如果想要在重写的actionPerformed 中调用, 就要把它生命为成员变量.

而且如果ActionListener的事件少, 或者关联性不强的话, 不要用实现ActionListener 的方法来做, 因为这样需要判断事件源, 浪费时间, 有如下两种解决方案:
1. 声明称成员变量: //setVisible(true);放在哪儿都可以, 最好是和JFrame的声明和设置放在一起, 在add之前和之后都没有影响.
public class WinTable1 extends JFrame implements ActionListener {
JTextField Tname;
protected WinTable1() {
super("学生成绩管理系统");
setVisible(true);
setSize(650, 180);
Container con = getContentPane();
con.setLayout(new FlowLayout());
JTable table = new JTable(0, 0);
JLabel num, name, answer;
JTextField Tnum, Tanswer;
num = new JLabel("按学号查询:");
name = new JLabel("按姓名查询:");
answer = new JLabel("查询结果:");
Tnum = new JTextField(12);
Tname = new JTextField(12);
Tanswer = new JTextField(30);
Tnum.addActionListener(this);
Tname.addActionListener(this);
Tanswe