- ベストアンサー
子パネルから親パネルのコントロール
フレームの上に親パネルが張られており、その親パネルの上に子パネルがはられております。 親パネルにメソッドを用意しておいて、子パネルのイベント発生のタイミングでその親パネルメソッドを行いたいのです。 どのように親パネル内でメソッドを定義すれば子パネル内で親パネルメソッドの発行ができるのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>ということは、私は子パネルでイベントを取得して子パネルのリスナで親パネルのメソッドを呼ぶばよいのでしょうか? いいと思います。 ついでながら複数の子パネルからイベントを受け取る場合、 どのパネルからのメソッドか判別する処理が必要になるかもしれませんが、 その場合は下記質問を参照ください。
その他の回答 (5)
- liar_adan
- ベストアンサー率48% (730/1515)
>すみません、私が未熟なものでliar_adanさんの話についていけていません・・・ いえ、こちらこそすみません。 書いているあいだ、自分でも 「わかりにくい文章だなあ…」と思ってました。 (そのまま書いちゃいけませんね) AWTのイベントモデルでは、 コンポーネント(Panelも含む)にリスナを、addXXXListener()で加えて イベントを受け取る仕掛けになっています。 ユーザーからのイベント(マウスを押したとか)を 受け取るのはコンポーネントなのですが、 イベントはコンポーネントを素通りして、リスナに渡されます。 この間、コンポーネントができることはあまりありません。 イベントが起こる場合には、コンポーネントより リスナの方に注目すべきなのです。 たとえばMouseListenerを子パネルに追加するときは class KoPanelMouseListener implements MouseLisntner{ void mouseClicked(MouseEvent e){...} .... } ... KoPanel koPanel = new KoPanel(); KoPanelMouseListener listener = new KoPanelMouseListener(); koPanel.addMouseListener(listener); という風になります。 イベントが起こったときに起動されるのは、 この場合ではKoPanelMouseListenerの中の mouseClicked()等のメソッドです。 コンポーネントの中のメソッドは起動されません。 だから、最終的に使いたいメソッドがどこにあろうとも、 リスナの中でそれを起動すればいいわけです。 #注意 上記の文はJDK1.1以降のイベントモデルを使っています。 それ以前は継承ベースのイベントモデルもありました。 これについては詳しくないのでよくわかりません。
お礼
度度々ご回答ありがとうございました。 リスナとイベントの関係、非常にわかりやすく教えていただきありがとうございました。 ということは、私は子パネルでイベントを取得して子パネルのリスナで親パネルのメソッドを呼ぶばよいのでしょうか?
- liar_adan
- ベストアンサー率48% (730/1515)
>implementsとはどのような働きをするのですか? たとえ話になりますが… extendsとimplementsは、似た働きをします。 extendsで他のクラスを「継承」しますが、 implementsはインタフェースを「実装」します。 実装というのは、免許証みたいなものです。 XXインタフェースを実装していれば、 そのクラスはXXインタフェースとしての働きをできるわけです。 パネルに、たとえばMouseListenerをimplementsすれば、 MouseListenerとしての働きができるクラスが作れます。 ところで、#3さんの方法について気になることがあります。 1つは、イベントを受け取るときはリスナを登録する必要があるので、 親パネルを継承しても、結局、間にリスナが入ります。 イベントの流れとしては 子パネルのイベント発生→イベントがリスナに伝わる→リスナ内のメソッドが起動。 という順番になります。 親パネルを継承しても、イベント発生時に直接、 親パネルのメソッドを呼び出すことは困難だと思います。 第二に、「親パネルを継承してそのメソッドを起動する」やり方だと、 そのメソッドが非常に単純なものならいいですが、 親パネルのフィールドを使うことはできません。 (オブジェクトとして違うので) 私としては親パネルを継承してもあまりメリットはないように思います。
お礼
度々のお答えありがとうございました。 先日のお答えで下記のようにありましたが、親パネルのメソッドは子パネル内で発行できるのでしょうか? ********************************************* class OyaPanel extends Panel implements XXXListener{ ... } Panel koPanel = new Panel(); koPanel.addXXXListener(oyaPanel); ********************************************* もう少し例文を具体的に書いていただくと助かります。 すみません、私が未熟なものでliar_adanさんの話についていけていません・・・
- okure_donchan
- ベストアンサー率54% (25/46)
No.1のものです。 親パネル・・・ParentPanel 子パネル・・・ChildPanel というクラスだとします。 親パネルは class ParentPanel extends Panel{ ・・・中省略・・・ } Panelを継承してますよね。 それで子パネルで親パネルを継承します。 class ChildPanel extends ParentPanel{ ・・・中省略・・・ } するとこれらの関係は Panel→継承→ParentPanel→継承→ChildPanel という形での多重継承です。 これで子パネルはPanelクラスとParentPanelクラスの両方のメソッドを使用できます。
お礼
度々のご回答ありがとうございました。 親パネルは ******************************************* class ParentPanel extends Panel{ ・・・中省略・・・ } Panelを継承してますよね。 それで子パネルで親パネルを継承します。 class ChildPanel extends ParentPanel{ ・・・中省略・・・ } ******************************************* とのことですが現在子パネルもPanelを継承しているのです。 class ChildPanel extends Panel{ ・・・中省略・・・ } とすると親パネル継承するにはどのように書けばよいのですか?
- liar_adan
- ベストアンサー率48% (730/1515)
子パネルに与えるイベントリスナに、親パネルの参照を保持しておいて、 そのメソッドを起動するといいと思います。 つまり 子パネル→リスナ→親パネル との段階です。 場合によっては、親パネルを継承するときイベントリスナも実装して、 子パネルに自分自身を与える。というやり方もあります。 class OyaPanel extends Panel implements XXXListener{ ... } Panel koPanel = new Panel(); koPanel.addXXXListener(oyaPanel); こうすると、クラスの総数が減らせる利点があります。 (それほどの利点ではありませんが)
お礼
お答えありがとうございます。 implementsとはどのような働きをするのですか?
- okure_donchan
- ベストアンサー率54% (25/46)
子パネルで親パネルを継承してイベント発生時に呼び出すという方法が考えられます。
お礼
お答えありがとうございました。 私の説明不足なのですが、現在子パネルは既にパネルオブジェクトを継承したクラスとして定義してあり、そこえさらに親パネルを継承するにはどうしたらよいのでしょうか? 例 public class Ko_Panel extends Panel{
お礼
お答えありがとうございました。 >ついでながら複数の子パネルからイベントを受け取る場合、 どのパネルからのメソッドか判別する処理が必要になるかもしれませんが、 その場合は下記質問を参照ください。 実は考えていました・・・ 本当にありがとうございました。