- ベストアンサー
アプレットについて
リストの「明治」をクリックするとactionPerformedが呼ばれますが、コンストラクタで代入したListへの参照変数lが「null」と表示されてしまいif文で比較することができません。 MyListenerのコンストラクタではちゃんと参照する値が入っているのに、なぜactionPerformedが呼ばれたときに「null」になるかが分からない次第であります。 回答のほどよろしくお願い致します。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; class MyListener implements ActionListener{ private List l; public MyListener(){} public MyListener(List l){ System.out.println(l); System.out.println("MyListener"); this.l = l; System.out.println(this.l); } public void actionPerformed(ActionEvent evt){ System.out.println("actionPerformed"); System.out.println(this.l); if(l == evt.getSource()){} //比較ができない } } public class MyApplet2 extends Applet{ private Panel sePanel, buttonPanel, waPanel, controlPanel; private List l; public void init(){ buttonPanel = new Panel(); waPanel = new Panel(); //レイアウトの設定 setLayout(new BorderLayout()); l = new List(1); l.add("明治"); waPanel.add(l); add(waPanel, "South"); //イベントリスナを登録する l.addActionListener(new MyListener()); new MyListener(l); } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >とした場合に 同じpublic MyListener(List l){ >が呼ばれる事になります。 >と言う事は前に登録したものが上書きされてしまう >のでどう対処すればいいのでしょうか? これは、違います。 それぞれにリスナのインスタンスを生成しているので、上書きされてしまったりはしません。 より丁寧にこう書いた方がわかりやすいのかな。 l1 = new List(1); l1.add("明治"); MyListener l1Listener = new MyListener(l1); l1.addActionListener(l1Listener); l2 = new List(1); l2.add("世紀"); MyListener l2Listener = new MyListener(l2); l2.addActionListener(l2Listener); MyListenerクラスのインスタンスであるl1Listenerとl2Listenerはそれぞれに生成しているので、別物です。上書きされたりはしません。 ちょうど、Listクラスのインスタンスであるl1とl2が別物であるのと同様です。 クラスはひとつでも、それから生成されるインスタンスは複数個存在することができるわけです。
その他の回答 (3)
- Bonjin
- ベストアンサー率43% (418/971)
>l2 = new List(1); >l2.add("世紀"); >l2.addActionListener(new MyListener(l2)); >とした場合に 同じpublic MyListener(List l){が呼ばれる事になります。 >と言う事は前に登録したものが上書きされてしまうのでどう対処すればいいのでしょうか? 聞く前に試してみましたか? 試してみればすぐわかりますが、上書きされません。 元の質問もそうですが、基本が解っていないために出てくる質問です。 まずは入門書を読むなりして基本を身につけましょう。
お礼
回答ありがとうございます。 インスタンスが複数個作成されるということがよく理解出来ていませんでした。ご指摘ありがとうございます。
- anmochi
- ベストアンサー率65% (1332/2045)
#1さんの言うとおりで、理由を説明すると、それは「MyListenerのインスタンスが2つあるから」だ。 l.addActionListener(new MyListener()); // ListのリスナーであるMyLisnterインスタンス1の内部変数lはnull new MyListener(l); // ここでもう一個作成されたMyListenerインスタンス2の内部変数lはアプレットのlを指す。 ここで、リストがクリックされると呼び出されるのはlがnullであるインスタンス1の方なんだな。
補足
回答ありがとうございます。 l.addActionListener(new MyListener(l));でできました。 ところで複数のリストを作成した場合、 l2 = new List(1); l2.add("世紀"); l2.addActionListener(new MyListener(l2)); とした場合に 同じpublic MyListener(List l){が呼ばれる事になります。 と言う事は前に登録したものが上書きされてしまうのでどう対処すればいいのでしょうか? 宜しくお願い致します。
- Bonjin
- ベストアンサー率43% (418/971)
>l.addActionListener(new MyListener()); >new MyListener(l); ではなく >l.addActionListener(new MyListener(l)); ではないですか?
補足
回答ありがとうございます。 l.addActionListener(new MyListener(l));でできました。 ところで複数のリストを作成した場合、 l2 = new List(1); l2.add("世紀"); l2.addActionListener(new MyListener(l2)); とした場合に 同じpublic MyListener(List l){が呼ばれる事になります。 と言う事は前に登録したものが上書きされてしまうのでどう対処すればいいのでしょうか? 宜しくお願い致します。
お礼
回答ありがとうございます。 インスタンスが複数個作成されるということがよく理解出来ていませんでした。ご指摘ありがとうございます。