////////////////////////////////////////////////////////////////////////////////
//  << j345b.java >>
//
//  アプレット(4):イベント処理(キー操作、KeyAdapterクラス、内部クラス)
//
// ●操作
//  押されたキーを文字列として表示する。
//
// ●イベント処理
//  イベントソース: キー操作
//  イベントクラス: KeyEventクラス
//  イベントリスナ: KeyAdapterクラスを拡張したクラス
//
// ●アダプタクラス
//  イベントリスナは、KeyListenerインターフェースのすべてのメソッドを
//    定義しなければならない。これをさけるためアダプタクラス呼ばれるクラスが
//    準備されている。
//  適当なアダプタクラスを使うと、必要なメソッドのみオーバーライドするだけで
//  よい。
//    ・アダプタクラスは、KeyListenerインターフェースのメソッドを空のメソッド
//      として定義しただけである。
//   ・コンパイルすると2つのクラスファイルが生成される。
//   j345b.class, j345b$EventListener.class
//
////////////////////////////////////////////////////////////////////////////////

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.*; 

public class j345b extends Applet {

  Font f;
  String s = "";

  public void init() {

    // アプレットの背景色を灰色に設定。
    this.setBackground(Color.lightGray);

    f = new Font("Courier", Font.BOLD, 48);

    // イベントリスナの作成。
    EventListener el = new EventListener();

    // イベントリスナの登録。
    this.addKeyListener(el);

    // アプレットにフォーカスを与える。
    this.requestFocusInWindow(); 

  }

  public void paint(Graphics g) {
    g.setColor(Color.green);
    g.setFont(f);
    g.drawString(s,50,50);
  }

  // アダプタクラスを内部クラスとして定義。
  class EventListener extends KeyAdapter {
    // 残りのメソッド(keyPressed,keyReleased)の定義が省略できる。  
    // keyTypedメソッドの定義。
    public void keyTyped(KeyEvent e) {
      s = s + e.getKeyChar();
      repaint(); // 再描画。
    }                                              
  }

}
HTMLファイル
<html>
<head>
  <title>アプレット</title>
</head>
<body bgcolor=white text=black>
<applet code="j345b.class" width="300" height="100">
</applet>
<body>
<html>
実行結果