import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class keyTimer extends JFrame implements KeyListener
{
	Timer secondTimer;
	JLabel statusBar;
	JLabel marqueeBar;
	int counter = 0;
	
	int kChar;
	int kCode;
	String kText;
	
public keyTimer()
   {
   statusBar = new JLabel();
   marqueeBar = new JLabel();
   
   Container c = getContentPane();
   c.setLayout(new BorderLayout());
   c.add( statusBar, BorderLayout.SOUTH );
   c.add( marqueeBar, BorderLayout.NORTH );
   
   // timer handler
   eventClass secondHandler = new eventClass();
   secondTimer = new Timer(1000, secondHandler);
   
   // key handler
   addKeyListener(this);
   
   secondTimer.start();
   setSize(1000, 200);
   setDefaultCloseOperation(EXIT_ON_CLOSE);
   setVisible(true);
   }

public void keyPressed( KeyEvent event )
   {
   // reset couinter, so exit won't happen in actionPerformed method of Timer handler
   counter = 0;
   }
          
public void keyReleased( KeyEvent event )
   {
   kCode = event.getKeyCode();
   kChar = event.getKeyChar();
   kText = event.getKeyText( kCode );
   marqueeBar.setText("Release: " + kCode + " " + kChar + " " + kText);
   } 
         
public void keyTyped( KeyEvent event )
   {
   marqueeBar.setText(marqueeBar.getText() + " Held ");
   }

public static void main (String [] args )
   {
   keyTimer app = new keyTimer();
   }

// actions   
private class eventClass implements ActionListener 
   {
   public void actionPerformed ( ActionEvent e ) 
      {
	  // increment and print counter. If counter gets to 10, exit.
      counter = counter + 1;
	  statusBar.setText( String.valueOf(counter) );
	  if (counter == 10)
	     {
		 System.exit(0);
		 } // end if
	  } // end actionPerformed
	} // end eventClass
	
} // end class
