import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * A timer which will correct itself since the javax.swing.Timer * is very inaccurate. */ public class TargetsTimer extends javax.swing.Timer { /* * The previous time that actionPerformed was called(in ms). */ private long previousTime = 0; /* * The original value of the delay, since we call setDelay * multiple times and it modifies the other delay variable. */ private int originalDelay; /* * Constructor. * @param delay the delay between time units * @param listener an actionlistener used to keep track of the time */ public TargetsTimer(int delay, ActionListener listener) { super(delay, listener); originalDelay = delay; } /** * Override the fireActionPerformed method so we can * keep track of the previous time and determine how * inaccurate the update was. * @param e an ActionEvent */ protected void fireActionPerformed(ActionEvent e) { super.fireActionPerformed(e); if (previousTime != 0) { int timeDifference = (int)((previousTime+super.getDelay())-System.currentTimeMillis()); if ((originalDelay + timeDifference) > 0) { super.setDelay(originalDelay + timeDifference); } } previousTime = System.currentTimeMillis(); } /* * Set the delay, reset originalDelay and previousTime variables. * @param delay the requested delay */ public void setDelay(int delay) { super.setDelay(delay); originalDelay = delay; previousTime = 0; } /* * Stop and reset the previous time. */ public void stop() { super.stop(); previousTime = 0; } }