The source code:
(Download the below file: Keyboard1.java)
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Keyboard1 extends Applet implements KeyListener, MouseListener { int width, height; int x, y; String s = ""; public void init() { width = getSize().width; height = getSize().height; setBackground( Color.black ); x = width/2; y = height/2; addKeyListener( this ); addMouseListener( this ); } public void keyPressed( KeyEvent e ) { } public void keyReleased( KeyEvent e ) { } public void keyTyped( KeyEvent e ) { char c = e.getKeyChar(); if ( c != KeyEvent.CHAR_UNDEFINED ) { s = s + c; repaint(); e.consume(); } } public void mouseEntered( MouseEvent e ) { } public void mouseExited( MouseEvent e ) { } public void mousePressed( MouseEvent e ) { } public void mouseReleased( MouseEvent e ) { } public void mouseClicked( MouseEvent e ) { x = e.getX(); y = e.getY(); s = ""; repaint(); e.consume(); } public void paint( Graphics g ) { g.setColor( Color.gray ); g.drawLine( x, y, x, y-10 ); g.drawLine( x, y, x+10, y ); g.setColor( Color.green ); g.drawString( s, x, y ); } }
Try clicking and typing into the applet. You'll probably have to click at least once before you begin typing, to give the applet the keyboard focus.
Go here for more information.
Here's a second applet that nicely integrates most of what we've learned so far.
(Download the below file: Keyboard2.java)
import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; public class Keyboard2 extends Applet implements KeyListener, MouseListener, MouseMotionListener { int width, height; int N = 25; Color[] spectrum; Vector listOfPositions; String s = ""; int skip = 0; public void init() { width = getSize().width; height = getSize().height; setBackground( Color.black ); spectrum = new Color[ N ]; for ( int i = 0; i < N; ++i ) { spectrum[i] = new Color( Color.HSBtoRGB(i/(float)N,1,1) ); } listOfPositions = new Vector(); addKeyListener( this ); addMouseListener( this ); addMouseMotionListener( this ); } public void keyPressed( KeyEvent e ) { } public void keyReleased( KeyEvent e ) { } public void keyTyped( KeyEvent e ) { char c = e.getKeyChar(); if ( c != KeyEvent.CHAR_UNDEFINED ) { s = s + c; repaint(); e.consume(); } } public void mouseEntered( MouseEvent e ) { } public void mouseExited( MouseEvent e ) { } public void mouseClicked( MouseEvent e ) { s = ""; repaint(); e.consume(); } public void mousePressed( MouseEvent e ) { } public void mouseReleased( MouseEvent e ) { } public void mouseMoved( MouseEvent e ) { // only process every 5th mouse event if ( skip > 0 ) { -- skip; // this is shorthand for "skip = skip-1;" return; } else skip = 5; if ( listOfPositions.size() >= N ) { // delete the first element in the list listOfPositions.removeElementAt( 0 ); } // add the new position to the end of the list listOfPositions.addElement( new Point( e.getX(), e.getY() ) ); repaint(); e.consume(); } public void mouseDragged( MouseEvent e ) { } public void paint( Graphics g ) { if ( s != "" ) { for ( int j = 0; j < listOfPositions.size(); ++j ) { g.setColor( spectrum[ j ] ); Point p = (Point)(listOfPositions.elementAt(j)); g.drawString( s, p.x, p.y ); } } } }
Click, type, and move the mouse. You might see some flickering. Depending on the speed of your computer, you might also find that the mouse position is being sampled too quickly or too slowly. The upcoming lessons will give you tools to fix both of these problems.
Update (December 2010): I received the following email message that might be useful to some readers.
Thank you for your applet tutorial. I think that there is part of your tutorial that is out of data with modern java.awt tool kits that prevents lesson 5 on keyboard inputs to work correctly. In most cases it will not type the text because clicking does not by default cause the window to receive focus. If your users update the mouseClicked method below to include "this.requestFocusInWindow();" then it will cause the key press events to be fired as is expected in the tutorial.public void mouseClicked(MouseEvent e) { this.requestFocusInWindow(); x = e.getX(); y = e.getY(); S = ""; repaint(); e.consume(); }Best Regards,
Lance Jensen