import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTarget;
import org.jdesktop.animation.timing.TimingTargetAdapter;

public class TimingSample4 extends BasicSample {

    private JLabel label;

    private Animator animator;

    public TimingSample4() {
        super();

        JPanel panel = new JPanel();
        panel.setLayout(null);

        label = new JLabel("");
        label.setFont(new Font("San-Serif", Font.BOLD, 24));
        label.setBounds(600, 100, 400, 50);
        panel.add(label);

        JButton loopButton = new JButton("LOOP");
        loopButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    animator.cancel();
                    animator.setRepeatBehavior(Animator.RepeatBehavior.LOOP);
                    animator.start();
                }
            });
        panel.add(loopButton);
        loopButton.setBounds(400, 200, 90, 20);

        JButton reverseButton = new JButton("REVERSE");
        reverseButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    animator.cancel();
                    animator.setRepeatBehavior(Animator.RepeatBehavior.REVERSE);
                    animator.start();
                }
            });
        panel.add(reverseButton);
        reverseButton.setBounds(500, 200, 90, 20);

        frame.add(panel, BorderLayout.CENTER);
        frame.setSize(new Dimension(600, 300));
        frame.setVisible(true);
        
        setAnimator();
    }

    private void setAnimator() {
        TimingTarget target = new TimingTargetAdapter() {
                private void setText() {
                    Date date = new Date();
                    label.setText(date.toString());
                }

                public void begin() {
                    setText();
                }

                public void repeat() {
                    setText();
                }

                public void end() {
                    clear();
                }

                public void timingEvent(float fraction) {
                    int x = 600 - (int)(1000 * fraction);
                    label.setLocation(x, 100);
                    setText();
                }
            };

        animator = new Animator(5000, Animator.INFINITE, Animator.RepeatBehavior.LOOP, target);
    }

    @Override
    protected void start() {
        animator.start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TimingSample4();
                }
            });
    }
}
