Home | History | Annotate | Download | only in swing
      1 package aurelienribon.utils.swing;
      2 
      3 import java.awt.event.ActionEvent;
      4 import java.awt.event.ActionListener;
      5 import javax.swing.JPanel;
      6 import javax.swing.Timer;
      7 
      8 /**
      9  * @author Aurelien Ribon | http://www.aurelienribon.com
     10  */
     11 public abstract class DrawingCanvas extends JPanel {
     12 	private final Timer timer;
     13 	private long lastMillis;
     14 	private Callback callback;
     15 
     16 	public DrawingCanvas() {
     17 		timer = new Timer(1000/60, loop);
     18 		timer.setRepeats(true);
     19 	}
     20 
     21 	protected abstract void update(int elapsedMillis);
     22 
     23 	public DrawingCanvas start() {
     24 		lastMillis = System.currentTimeMillis();
     25 		timer.start();
     26 		return this;
     27 	}
     28 
     29 	public void stop() {
     30 		timer.stop();
     31 	}
     32 
     33 	public void setCallback(Callback callback) {
     34 		this.callback = callback;
     35 	}
     36 
     37 	private final ActionListener loop = new ActionListener() {
     38 		@Override public void actionPerformed(ActionEvent e) {
     39 			final long millis = System.currentTimeMillis();
     40 			final long delta = millis - lastMillis;
     41 			lastMillis = millis;
     42 
     43 			update((int) delta);
     44 			if (callback != null) callback.onUpdate((int) delta);
     45 		}
     46 	};
     47 
     48 	public interface Callback {
     49 		public void onUpdate(int elapsedMillis);
     50 	}
     51 }
     52