我正在使用actionlistener

时间:2016-09-19 06:15:01

标签: java multithreading actionlistener

我试图理解为什么这个程序不起作用。我正确使用actionlistener为什么它没有显示从线程运行开始但线程没有运行的时间,我在屏幕上看不到任何内容。 我做错了什么,或者这是使用ActionListener类的错误方法 或者我没有正确使用它,这里是所有文件的代码。

import java.awt.event.*;
import java.util.TooManyListenersException;

public class Timer extends Thread {
    private int iTime = 0;
    private ActionListener itsListener = null;

    public Timer() {
        super(); // allocates a new thread object
        iTime = 0; // on creation of this object set the time to zero
        itsListener = null; // on creation of this object set the actionlistener
                            // object to null reference
    }

    public synchronized void resetTime() {
        iTime = 0;
    }

    public void addActionListener(ActionListener event) throws TooManyListenersException {
        if (event == null)
            itsListener = event;
        else
            throw new TooManyListenersException();
    }

    public void removeActionListener(ActionListener event) {
        if (itsListener == event)
            itsListener = null;
    }

    public void run() {

        while (true) {
            try {
                this.sleep(100);
            } 
            catch (InterruptedException exception) {
                // do nothing
            }
            iTime++;

            if (itsListener != null) {
                String timeString = new String(new Integer(iTime).toString());

                ActionEvent theEvent = new ActionEvent(this,
                        ActionEvent.ACTION_PERFORMED, timeString);

                itsListener.actionPerformed(theEvent);
            }
        }
    }
}

下一个文件

import java.awt.event.*;
import java.util.TooManyListenersException;

public class TextTimeDemonStration extends Object implements ActionListener {
    private Timer aTimer = null; // null reference for this object

    public TextTimeDemonStration() {
        super();

        aTimer = new Timer();

        try {
            aTimer.addActionListener(this);
        } 
        catch (TooManyListenersException exception) {
            // do nothing
        }

        aTimer.start();
    }

    public void actionPerformed(ActionEvent e) {
        String theCommand = e.getActionCommand();

        int timeElapsed = Integer.parseInt(theCommand, 10);

        if (timeElapsed < 10) {
            System.out.println(timeElapsed);
        }
        else
            System.exit(0);
    }
}

运行程序的主类的最后一个文件
public class MainTest {
    public static void main(String[] args) {
        TextTimeDemonStration test = new TextTimeDemonStration();    
    }    
}

1 个答案:

答案 0 :(得分:0)

TextTimeDemonStration课程中,您调用了aTimer.addActionListener(this);来指定一个动作侦听器

但是在您的Timer.addActionListener()方法中,在if else区块中,您编写了

if (event == null)
    itsListener = event;
else
    throw new TooManyListenersException();

由于this不为null,它将抛出将被捕获的TooManyListenersException异常。

之后启动计时器。但是,由于itsListener在初始化后为空,因此在Timer.run()方法中,永远不会执行if块。因此,什么也没做。

修复Timer.addActionListener()方法的逻辑,它应该可以正常工作。

希望这有帮助。