FileDocCategorySizeDatePackage
Dial.javaAPI DocExample3128Wed Jun 25 02:08:58 BST 1997magicbeans

Dial.java

package magicbeans;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
// beans
import java.beans.*;

public class Dial extends Component { 
	int minValue = 0, value, maxValue = 100, radius;
	Vector dialListeners;

	public Dial() {
		enableEvents( AWTEvent.MOUSE_MOTION_EVENT_MASK );
	}
	public Dial( int maxValue ) {
		this();
		this.maxValue = maxValue; 
	}

	public void paint( Graphics g ) {
		int tick = 10;
		radius = getSize().width/2 - tick;
		g.drawLine(radius*2+tick/2, radius, radius*2+tick, radius); // the tick
		draw3DCircle( g, 0, 0, radius, true );
		draw3DCircle( g, 1, 1, radius-1, true );
		int knobRadius = radius/7;
		double th = value*(2*Math.PI)/(maxValue-minValue);
		int x = (int)(Math.cos(th)*(radius-knobRadius*3)), 
			y = (int)(Math.sin(th)*(radius-knobRadius*3));
		draw3DCircle( g, x+radius-knobRadius, y+radius-knobRadius, knobRadius, false );
	}
	private void draw3DCircle( Graphics g, int x, int y, int radius, boolean raised ) {
		g.setColor( raised ? Color.white : Color.black );
		g.drawArc( x, y, radius*2, radius*2, 45, 180);
		g.setColor( raised ? Color.black : Color.white);
		g.drawArc( x, y, radius*2, radius*2, 225, 180);
	}

	public void processEvent( AWTEvent e ) {
		if ( e.getID() == MouseEvent.MOUSE_DRAGGED ) {
			int y=((MouseEvent)e).getY();
			int x=((MouseEvent)e).getX();
			double th = Math.atan( (1.0*y-radius)/(x-radius) );
			int value = ( (int)(th/(2*Math.PI) * (maxValue-minValue)) );
			if ( x < radius ) 
				setValue( value + maxValue/2 );
			else if ( y < radius )
				setValue( value + maxValue );
			else 
				setValue( value );
			fireEvent();
		}
		super.processEvent( e );
	}

	public Dimension getPreferredSize() { 
		return new Dimension( 100, 100 );
	}

    public void setValue(int value) { 
		this.value = value; 
		repaint(); 
	}
    public int getValue()  { return value; }
    public void setMinimum(int minValue )  { this.minValue = this.minValue; }
    public int getMinimum()  { return minValue; }
    public void setMaximum(int maxValue )  { this.maxValue = maxValue; }
    public int getMaximum()  { return maxValue; }

	public void addDialListener(DialListener listener) {
		if ( dialListeners == null )
			dialListeners = new Vector();
		dialListeners.addElement( listener );
	}
	public void removeDialListener(DialListener listener) {
		if ( dialListeners != null )
			dialListeners.removeElement( listener );
	}

	private void fireEvent() {
		// beans
		propChanges.firePropertyChange( "value", null, new Integer(value));

		if ( dialListeners == null )
			return;

		DialEvent event = new DialEvent(this, value);
		for (Enumeration e = dialListeners.elements(); e.hasMoreElements(); ) 
			((DialListener)e.nextElement()).dialAdjusted( event );
	}

	// beans
    private PropertyChangeSupport propChanges = new PropertyChangeSupport(this);

	public void addPropertyChangeListener(PropertyChangeListener listener) {
        propChanges.addPropertyChangeListener(listener);
    }
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propChanges.removePropertyChangeListener(listener);
	}
}