Spinner.java

package com.bozoid.cis370.hw05;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.font.*;
import java.awt.geom.*; // for AffineTransform


/**
An Animator that displays a spinning text string.
*/
public class Spinner implements Animator
{
    public Spinner(String msg,int fontsize)
    {
        this.msg = msg;
        angle = 0.0;
        xform = AffineTransform.getRotateInstance(0.0);
        font = new Font("Serif",Font.PLAIN,fontsize);
    }

    public Spinner(String msg)
    {
        this(msg,72);
    }

    public Spinner()
    {
        this("Hello",144);
    }

    public void oneFrame(Component comp,Graphics g)
    {
        Rectangle2D bounds;
        LineMetrics fmetrics;
        FontRenderContext fcontext;

        int w = comp.getWidth();
        int h = comp.getHeight();

        Graphics2D g2 = (Graphics2D)g;
        g2.setFont(font);
        fcontext = g2.getFontRenderContext();

        comp.setBackground(Color.RED);

        xform.setToTranslation(w/2.0,h/2.0);
        xform.rotate(angle);
        g2.setTransform(xform);

        g2.setFont(font);
        g2.setPaint(Color.PINK);

        bounds = font.getStringBounds(msg,fcontext);
        fmetrics = font.getLineMetrics(msg,fcontext);

        g2.drawString(msg,
            (float)(-bounds.getWidth()/2.0),
            (float)(bounds.getHeight()/2.0));

        angle = (angle + delta) % (2.0*Math.PI);
    }

    private String msg;
    private AffineTransform xform = null;
    private double angle = 0.0;
    private double delta = 0.1; // angular velocity
    private Font font = null;
}