简体   繁体   中英

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?

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.

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();
        }
    }
}

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

What are you trying to accomplish?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM