• ベストアンサー

アプレットについて

リストの「明治」をクリックすると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); } }

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.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が別物であるのと同様です。  クラスはひとつでも、それから生成されるインスタンスは複数個存在することができるわけです。

kyujikun
質問者

お礼

回答ありがとうございます。 インスタンスが複数個作成されるということがよく理解出来ていませんでした。ご指摘ありがとうございます。

その他の回答 (3)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

>l2 = new List(1); >l2.add("世紀"); >l2.addActionListener(new MyListener(l2)); >とした場合に 同じpublic MyListener(List l){が呼ばれる事になります。 >と言う事は前に登録したものが上書きされてしまうのでどう対処すればいいのでしょうか? 聞く前に試してみましたか? 試してみればすぐわかりますが、上書きされません。 元の質問もそうですが、基本が解っていないために出てくる質問です。 まずは入門書を読むなりして基本を身につけましょう。

kyujikun
質問者

お礼

回答ありがとうございます。 インスタンスが複数個作成されるということがよく理解出来ていませんでした。ご指摘ありがとうございます。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

 #1さんの言うとおりで、理由を説明すると、それは「MyListenerのインスタンスが2つあるから」だ。 l.addActionListener(new MyListener()); // ListのリスナーであるMyLisnterインスタンス1の内部変数lはnull new MyListener(l); // ここでもう一個作成されたMyListenerインスタンス2の内部変数lはアプレットのlを指す。 ここで、リストがクリックされると呼び出されるのはlがnullであるインスタンス1の方なんだな。

kyujikun
質問者

補足

回答ありがとうございます。 l.addActionListener(new MyListener(l));でできました。 ところで複数のリストを作成した場合、 l2 = new List(1); l2.add("世紀"); l2.addActionListener(new MyListener(l2)); とした場合に 同じpublic MyListener(List l){が呼ばれる事になります。 と言う事は前に登録したものが上書きされてしまうのでどう対処すればいいのでしょうか? 宜しくお願い致します。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

>l.addActionListener(new MyListener()); >new MyListener(l); ではなく >l.addActionListener(new MyListener(l)); ではないですか?

kyujikun
質問者

補足

回答ありがとうございます。 l.addActionListener(new MyListener(l));でできました。 ところで複数のリストを作成した場合、 l2 = new List(1); l2.add("世紀"); l2.addActionListener(new MyListener(l2)); とした場合に 同じpublic MyListener(List l){が呼ばれる事になります。 と言う事は前に登録したものが上書きされてしまうのでどう対処すればいいのでしょうか? 宜しくお願い致します。

関連するQ&A