アクション処理を外部のコンポーネントに伝搬するかどうかは、
そのコンポーネントの action() メソッドの返値によって判定されます。
Componentクラスの action()メソッドの定義は、ほとんど空でが、
正確に言うと
return false; の一行があります。
action()メソッドがこのデフォルトの内容しか含まない時は、
アクションの処理はコンポーネントの外側の親のオブジェクトに伝えられます。
Buttonクラスのオブジェクトのアクションを
アプレットの action() メソッドで一括して
処理できたのは、この仕組みのおかげです。
逆に
action()メソッドを独自に処理できるようにして、外部にアクションを伝搬する
必要がない場合には、メソッドの返値は true にしてください。
こうすると、外部のコンポーネント(たとえば
アプレット)の action() メソッドが不必要に呼び出されなくなります。
もちろん、コンポーネントの内部と外部の両方の action() メソッドで
処理を行ってもかまいません。
コンポーネント自身の action()メソッドで入力のエラーチェックを行い、
アプレットの action() の中でそのデータを処理するようなこともできるわけです。

action()メソッドの変値でイベントの伝搬がコントロールされる。
上のような仕組みがあるため、アクション処理のプログラム内での記述の方法は
大きく分けて2通りの方法があることになります。
個々のコンポーネントの action()メソッドはそのままにして、外側にある
アプレットなどの action()メソッドで一括して処理する方法と、
個々のコンポーネントの action()メソッドを再定義して、
その中で処理を行う方法です。
最終的に実行された時の振る舞いは全く同じですが、
プログラミングのスタイルは大きく変わります。
第二の方法を選択した場合には、当然新しいクラスの設計が必要となるからです。
もちろん、これらの2つの方法の混在もあり得ます。
Panelなどが複数の階層を持つ構造に配置されている場合には、
どのレベルのコンポーネントの action()処理を行うか、さらに自由度が増えます。
また、各コンポーネント内でのaction()メソッドの処理と、
外部のコンポーネントの action()メソッドでの処理を多段階に呼び出すことも
可能です。( action()の処理を定義しても、返値を false にすればよい。)