Swing Timer in Conjunction with Possible Long-running Background Task

Posted by javacavaj on Stack Overflow See other posts from Stack Overflow or by javacavaj
Published on 2010-04-07T15:12:10Z Indexed on 2010/04/07 15:13 UTC
Read the original article Hit count: 246

Filed under:
|

I need to perform a task repeatedly that affects both GUI-related and non GUI-related objects. One caveat is that no action should performed if the previous task had not completed when the next timer event is fired. My initial thoughts are to use a SwingTimer in conjunction with a javax.swing.SwingWorker object. The general setup would look like this.

class
{
    timer = new Timer(speed, this);
    timer.start(); 

    public void actionPerformed(ActionEvent e) 
    {
        SwingWorker worker = new SwingWorker() {
            @Override
            public ImageIcon[] doInBackground() {
                // potential long running task
            }

            @Override
            public void done() {
                // update GUI on event dispatch thread when complete
            }
    }
}

Some potential issues I see with this approach are:

1) Multiple SwingWorkers will be active if a worker has not completed before the next ActionEvent is fired by the timer.

2) A SwingWorker is only designed to be executed once, so holding a reference to the worker and reusing (is not?) a viable option.

Is there a better way to achieve this?

© Stack Overflow or respective owner

Related posts about java

Related posts about swing