import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; public class AnimationPlayer extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; private LightCanvasJPanel lightCanvas; private MusicList musicList; private JButton backward; private JButton stop; private JButton play; private JButton pause; private JButton forward; private long tick = 0; private boolean go = false; private boolean stopClock = false; private static final int TICK_JUMP = 20; private Thread tickClock = new Thread(new Runnable() { @Override public void run() { while(!stopClock) { if(!go) { // pause try { Thread.sleep(100); } catch (InterruptedException ignored) {} continue; } long before = System.currentTimeMillis(); lightCanvas.paintLights(musicList.render(tick)); tick += TICK_JUMP; long after = System.currentTimeMillis(); if(after - before < TICK_JUMP) { try { Thread.sleep(10 - after + before);} catch (InterruptedException ignored) {} } else if(after - before > TICK_JUMP) { System.err.println("Animation were slowed down by " + String.valueOf(after - before - 10) + " ticks !"); } } } }); public void stopTickClock() {stopClock = true;} public AnimationPlayer(LightCanvasJPanel lightCanvas, MusicList musicList) { this(lightCanvas, musicList, BoxLayout.LINE_AXIS); } public AnimationPlayer(LightCanvasJPanel lightCanvas, MusicList musicList, int direction) { this.lightCanvas = lightCanvas; this.musicList = musicList; setLayout(new BoxLayout(this, direction)); add(Box.createHorizontalGlue()); // backward button backward = new JButton(new ImageIcon(getClass().getResource("/icons/backward.png"))); backward.addActionListener(this); add(backward); // stop button stop = new JButton(new ImageIcon(getClass().getResource("/icons/stop.png"))); stop.addActionListener(this); add(stop); // play button play = new JButton(new ImageIcon(getClass().getResource("/icons/play.png"))); play.addActionListener(this); add(play); // pause button pause = new JButton(new ImageIcon(getClass().getResource("/icons/pause.png"))); pause.addActionListener(this); add(pause); // forward button forward = new JButton(new ImageIcon(getClass().getResource("/icons/forward.png"))); forward.addActionListener(this); add(forward); add(Box.createHorizontalGlue()); tickClock.start(); } @Override public void actionPerformed(ActionEvent e) { // TODO player actions if(e.getSource() == backward) { tick -= 500; if(tick < 0) tick = 0; }else if(e.getSource() == stop) { go = false; tick = 0; }else if(e.getSource() == play) { go = true; }else if(e.getSource() == pause) { go = false; }else if(e.getSource() == forward) { tick += 500; } } }