import java.awt.*; import java.awt.event.*; import java.applet.*; import java.net.*; public class Key extends Component implements MouseListener { private final AudioClip myAudioClip; private final Dimension mySize = new Dimension( 15, 70 ); private final int myKeyCode; private boolean iAmPressed = false; Key( int freq, int keyCode, Applet applet ) { myAudioClip = applet.getAudioClip( applet.getDocumentBase(), String.valueOf( freq ) + ".au"); myKeyCode = keyCode; setBounds( new Rectangle( mySize ) ); setForeground( Color.black ); if( myAudioClip instanceof AudioClip ) setBackground( new Color( 240, 240, 235 ) ); else setBackground( Color.darkGray ); addMouseListener( this ); } /* public void processEvent( AWTEvent e ) { System.err.println( "Key event " + e.toString() ); super.processEvent( e ); } */ public void mousePressed( MouseEvent e ) // MouseListener method { if( !isPressed() ) { play( true ); setKeyPressed( true ); } } public void mouseReleased( MouseEvent e ) // MouseListener method { if( isPressed() ) { play( false ); setKeyPressed( false ); } } public void mouseClicked( MouseEvent e ){} // MouseListener method public void mouseEntered( MouseEvent e ){} // MouseListener method public void mouseExited( MouseEvent e ){} // MouseListener method public boolean isPressed() { return iAmPressed; } public void play( boolean yes ) { if( myAudioClip instanceof AudioClip ) { if( yes ) { if( !iAmPressed ) myAudioClip.loop(); } else myAudioClip.stop(); } } public void setKeyPressed( boolean pressed ) { iAmPressed = pressed; repaint(); } public final int keyCode() { return myKeyCode; } public void paint( Graphics g ) // Component method { if( isVisible() ) { Shape clip = g.getClip(); Rectangle r = getBounds(); super.paint( g ); g.setClip( 0, 0, r.width, r.height ); g.setColor( Color.black ); drawBorder( g ); g.setColor( Color.black ); g.drawString( KeyEvent.getKeyText( myKeyCode ), 4, r.height - 4 ); g.setClip( clip ); } } private void drawBorder( Graphics g ) { final Color hi = iAmPressed ? Color.darkGray : Color.white, lo = iAmPressed ? Color.white : Color.darkGray; final Rectangle b = getBounds(); b.x = b.y = 0; g.setColor( getBackground() ); g.fillRect( b.x, b.y, b.width, b.height ); g.setColor( getForeground() ); g.drawRect( b.x, b.y, b.width, b.height ); g.setColor( hi ); g.drawLine( b.x + 1, b.y + 1, b.x + b.width - 2, b.y + 1 ); g.drawLine( b.x + 1, b.y + 1, b.x + 1, b.y + b.height - 2 ); g.setColor( lo ); g.drawLine( b.x + 2, b.y + b.height - 1, b.x + b.width - 1, b.y + b.height - 1 ); g.drawLine( b.x + b.width - 1, b.y + 2, b.x + b.width - 1, b.y + b.height - 2 ); } public Dimension getMinimumSize() // Component method { return mySize; } public Dimension getPreferredSize() // Component method { return mySize; } }