MrProper
MrProper

Reputation: 1580

How to pause Java Swing Timer?

I want to stop Timer at some point and then resume it from the point it was paused at. Methods stop(), start() won't work.

Is there function for pausing Timer and then resuming it? I guess it doesn't exist.

Does anyone have an idea how to achieve proper Timer pausing?

Upvotes: 3

Views: 8426

Answers (3)

Game Master Jack
Game Master Jack

Reputation: 113

There is no way I know of to truly 'pause' a Swing Timer but there are simple ways to emulate it. The simplist way I know of is to surround all actions in the timer with:

 if(!paused) {
  // place code here.

  System.out.println("I am not Paused.");
 } else {

  System.out.println("I am Paused.");
 }

an example of this used in a program would be:

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

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



public class ExampleClass implements ActionListener {
 static boolean paused = false;

 // delay in miliseconds.
 static int delay = 5;

 static Timer timer = new Timer(delay, new ExampleClass());

 static JFrame jf = new JFrame();
 static JPanel jp = new JPanel();
 static JButton pause = new JButton("PAUSE");
 static JButton unpause = new JButton("UNPAUSE");

 public static void main(String[] args) {
  System.out.println("Starting Program...");

  pause.addActionListener(new ExampleClass());
  unpause.addActionListener(new ExampleClass());
  jp.add(pause);
  jp.add(unpause);



  jf.setSize(100, 100);
  jf.setTitle("Window");
  jf.setResizable(false);
  jf.setLocationRelativeTo(null);
  jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
  jf.add(jp);
  jf.setVisible(true);


  timer.start();

 }

@Override
public void actionPerformed(ActionEvent e) {
 if(!paused) {
     System.out.println("IM NOT PAUSED!!! YAY!!!!");

     if(e.getSource() == pause) {
         paused = true;
     }
 } else {
     System.out.println("urk... can't move... help me...");
     if(e.getSource() == unpause) {
         paused = false;
     }
 }


}
}

And there you go. also instead of having buttons to pause and unpause you may also (obviously) use getters and setters.

Upvotes: 2

mKorbel
mKorbel

Reputation: 109823

javax.swing.Timer.setDelay(int);

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

public class DelayedPaint {

    private CenterPanel center;
    private JFrame frame;
    private JPanel panel;

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new DelayedPaint().createAndShowGUI();
            }
        });
    }

    void createAndShowGUI() {
        frame = new JFrame("Delayed Paint");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        panel = new JPanel(new BorderLayout());
        frame.setContentPane(panel);
        NorthPanel north = new NorthPanel();
        panel.add(north, BorderLayout.NORTH);
        center = new CenterPanel();
        panel.add(center, BorderLayout.CENTER);
        frame.setVisible(true);
        north.startTimer();
    }

    class NorthPanel extends JPanel {

        private JLabel lb;

        public NorthPanel() {
            lb = new JLabel("Good morning");
            add(lb);
        }

        public void startTimer() {
            ActionListener taskPerformer = new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setLayout(new FlowLayout(FlowLayout.LEFT));
                    lb.setText("Left");
//    timer.stop(); // Not needed if setRepeats(false).
                    center.startTimer();
                }
            };
            javax.swing.Timer timer = new javax.swing.Timer(2000, taskPerformer);
            timer.setRepeats(false);
            timer.start();
        }
    }

    class CenterPanel extends JPanel {

        private int icnt;
        private Font boldFont = new Font("Dialog", Font.BOLD, 15);
        private Properties centerProps;
        private javax.swing.Timer timer;

        public CenterPanel() {
            centerProps = new Properties();
            centerProps.setProperty("circle", "false");
            centerProps.setProperty("lastString", "0");
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            if (Boolean.valueOf(centerProps.getProperty("circle"))) {
                Dimension dim = frame.getSize();
                g2.draw(new Arc2D.Double(50, 25, dim.height - 100, dim.width - 100, 0, 360, Arc2D.OPEN));
            }
            int j = Integer.parseInt(centerProps.getProperty("lastString"));
            if (j > 0) {
                g2.setFont(boldFont);
                for (int i = 1; i <= j; i++) {
                    g2.drawString("" + (char) (i + 48), i * 10, 50);
                }
            }
        }

        public void startTimer() {
            ActionListener taskPerformer = new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    repaint(); // in paintComponent(...) icnt is already icnt+1.
                    icnt++;
                    if (icnt == 1) {
                        centerProps.setProperty("circle", "true");
                        timer.setDelay(500);
                    } else if (icnt <= 10) {
                        centerProps.setProperty("lastString", String.valueOf(icnt - 1));
                        if (icnt == 10) {
                            timer.stop();
                        }
                    }
                }
            };
            timer = new javax.swing.Timer(2000, taskPerformer);
            timer.start();
        }
    }
}

Upvotes: 3

Roger Lindsj&#246;
Roger Lindsj&#246;

Reputation: 11553

There is no way to pause the timer, only stop and start again.

What are you trying to accomplish?

Upvotes: 0

Related Questions