package trident.swing.tracker; import java.awt.*; import java.util.ArrayList; import java.util.List; import javax.swing.JComponent; import org.pushingpixels.trident.Timeline; import org.pushingpixels.trident.Timeline.TimelineState; import org.pushingpixels.trident.callback.TimelineCallbackAdapter; public class TimelineVisualizer extends JComponent { private List<TimelineVisualizerDot> dots; public TimelineVisualizer() { this.dots = new ArrayList<TimelineVisualizerDot>(); } public void addDot(float absoluteTimelinePosition, float perceivedTimelinePosition) { synchronized (this.dots) { final TimelineVisualizerDot dot = new TimelineVisualizerDot(); dot.setLocation(new Point( (int) (absoluteTimelinePosition * getWidth()), (int) (perceivedTimelinePosition * getHeight()))); this.dots.add(dot); Timeline dotTimeline = new Timeline(dot); dotTimeline.addPropertyToInterpolate("opacity", 1.0f, 0.0f); dotTimeline.addCallback(new TimelineCallbackAdapter() { @Override public void onTimelineStateChanged(TimelineState oldState, TimelineState newState, float durationFraction, float timelinePosition) { if (newState == TimelineState.DONE) { synchronized (dots) { dots.remove(dot); } } } }); dotTimeline.setDuration(2000); dotTimeline.play(); } } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.black); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); synchronized (this.dots) { for (TimelineVisualizerDot dot : this.dots) { dot.paint(g2d); } } g2d.dispose(); } }