Reputation: 1580
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
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
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
Reputation: 11553
There is no way to pause the timer, only stop and start again.
What are you trying to accomplish?
Upvotes: 0