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); } }