• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:イベントリスナーのクラスの書きどころ)

イベントリスナーのクラスの書きどころ

このQ&Aのポイント
  • イベントリスナーのクラスをどこに記述するのか、分からない初心者の質問です。
  • BaseFrameクラスのwindowOpened()内部クラスで基本動作を記述し、AFrameクラスとBFrameクラスから実現したいイベントリスナーのクラスを切り分ける方法が良いでしょう。
  • しかし、この方法ではコントロールとイベントの関連性が不透明になる可能性があるため、慎重に検討する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

BaseFrameクラスの動作は、 public void windowOpened(WindowEvent e){ foo(); // 基本となる動作を行うメソッド } protected void foo(){ System.out.println("abc"); } こういうような感じなのでしょうか。 ここでサブクラスの振る舞いを変えるには、foo()をオーバーライドすると良いでしょう。 AFrameでは、 protected void foo(){ super.foo(); // BaseFrameのfooが呼び出される System.out.println("def"); } BFrameでは protected void foo(){ System.out.println("ghi"); super.foo(); // BaseFrameのfooが呼び出される } というように処理を切り分けてメソッド化させると良いのではないでしょうか。

naktak
質問者

補足

やはり文章だけだと伝わりませんよね^^;文字数増やしてもらいたいです・・・。 現在、以下のようになっています。別に作りにはこだわっていません。 【BaseFrame】 public class BaseFrame extends Frame { //コンストラクタ public BaseFrame() { addWindowListener(new eventWindowListener()); } //ウィンドウイベント protected class eventWindowListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e) { System.out.println("abc"); } } } 【AFrame】 public class CoreFrame extends BaseFrame { //コンストラクタ public CoreFrame() { super(); setSize(150, 150); addWindowListener(new eventWindowListener()); } protected class eventWindowListener extends WindowAdapter { public void windowOpened(WindowEvent e) { System.out.println("def"); } } } BFrameについては途中でこの作りだとダメだという事に気付いたので、作っていません。 そして、この作りだと、なんか美しくない気もします・・・。イベントリスナーの内部クラス部だけ継承とか無視してますし。 やはり仰る通り、コントロールとイベントを完全に切り分けるのが良いのでしょうか? やりたい事は、『ベースとなる基本的な動作が存在し、継承先は基本的にそれを利用して足りない所は個々で補うが、 場合によってはベースとなる基本的な動作が実行される前に実行したい処理があった時にも対応したい』のです。 なので、仰る方法のようにベースになる処理をいつ呼ぶか、を制御したいのですが、 切り分けが大きくなると、Frameクラス自体と、イベントリスナークラスが完全に切り分けられ、 どのFrameクラスでどのイベントリスナークラスを使っているのか追えなくなってくるのか?などと思ってしまいました。 試してはいませんーー^^;

その他の回答 (1)

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

仰るとおり、イベントとコントロールの処理は切り分けた方がいいです。 イベントリスナーをサブクラスにしていると切り分けが難しくなるかもしれません。 なので、WindowAdapterクラスは使わず、FrameにWindowListenerをimplementsさせたほうが いいかと思います(誤解を承知で書きますがWindowAdapterはイベント処理を手抜きするためのクラスです) そうすればイベントリスナーとFrameが一体になりますし、サブクラスにイベントリスナーの 追加処理を書くこともないのでコードの分散化も防ぐことができるでしょう。 public class BaseFrame extends Frame implements WindowListener{ //コンストラクタ public BaseFrame() { addWindowListener(this); } public void windowOpened(WindowEvent e){ ... } ... }

naktak
質問者

お礼

あ、なるほど。WindowListenerを利用すれば何の問題もなく すっきりと解決できますね^^ ありがとうございました。