18f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipackage aurelienribon.utils.swing; 28f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 38f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.event.ActionEvent; 48f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.event.ActionListener; 58f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.swing.JPanel; 68f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.swing.Timer; 78f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 88f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi/** 98f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi * @author Aurelien Ribon | http://www.aurelienribon.com 108f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi */ 118f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipublic abstract class DrawingCanvas extends JPanel { 128f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private final Timer timer; 138f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private long lastMillis; 148f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private Callback callback; 158f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 168f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public DrawingCanvas() { 178f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi timer = new Timer(1000/60, loop); 188f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi timer.setRepeats(true); 198f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 208f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 218f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi protected abstract void update(int elapsedMillis); 228f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 238f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public DrawingCanvas start() { 248f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi lastMillis = System.currentTimeMillis(); 258f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi timer.start(); 268f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi return this; 278f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 288f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 298f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void stop() { 308f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi timer.stop(); 318f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 328f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 338f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setCallback(Callback callback) { 348f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.callback = callback; 358f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 368f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 378f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private final ActionListener loop = new ActionListener() { 388f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi @Override public void actionPerformed(ActionEvent e) { 398f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi final long millis = System.currentTimeMillis(); 408f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi final long delta = millis - lastMillis; 418f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi lastMillis = millis; 428f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 438f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi update((int) delta); 448f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi if (callback != null) callback.onUpdate((int) delta); 458f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 468f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi }; 478f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 488f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public interface Callback { 498f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void onUpdate(int elapsedMillis); 508f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 518f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi} 52