• ベストアンサー

アプレットについて

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

  • Java
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • 画像を重ね表示するアプレット

    現在プログラミングを学んでいる、Java初心者です。 最初に何もない状態から、 ボタンを押すと画像が表示され、 ボタンを押すたびに画像が階段状に重なり、 何度か押すと、最初の場所に別の画像が 表示されるアプレットを作りたいです。 そこで簡単なソースを書いてみました。 /* *<Applet code=cardTest width=300 height=650> *</Applet> */ import java.awt.*; import java.awt.event.*; import java.awt.Graphics; import java.awt.Image; import javax.swing.*; import javax.swing.border.*; public class cardTest extends JApplet implements ActionListener{   JPanel pan1,pan2;   JButton hbtn=new JButton("hit");   int y =1;   int cardPoint=0;   Image dk,bust;   Graphics g;   public void init(){ Container con=getContentPane(); pan1=new JPanel(); pan2=new JPanel(); con.add(pan1); con.add(pan2,"South"); pan1.setLayout(null); pan1.setBackground(Color.green); pan1.setSize(250,600); pan2.setSize(250,100); pan2.add(hbtn); hbtn.addActionListener(this); dk=getImage(getCodeBase(),"dk.GIF"); bust=getImage(getCodeBase(),"bust.gif");   }   public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals("hit")){       System.out.println("hit!"); cardDisp(); }   }   public void cardDisp(){ System.out.println("carddisp!"); if(cardPoint>21){ System.out.println("bust!"); g.drawImage(bust,0,0,this); }else{ System.out.println("card!"); g.drawImage(dk,0,0+y*10,this); cardPoint+=10; y++; }   } } 確認用に、いくつかコメントが表示されるようにしています。 重ね表示するのでラベルは使えないと思い、 参考書が見つからず困っています。 cardDisp()が間違っていると思うのですが、 具体的にどう直せばよいのかわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • アプレットのプログラムがコンパイルできません。

    import java.applet.Applet; import java.awt.*; public class Lesson1Applet extends Applet { public void init(){ this.add(new Lesson1("")); this.setLayout(null); this.resize(600,450); } } 上記のプログラムがコンパイルできません。 本の通りに作ってみたのですが、コンパイルが出来ず Servlet1118Applet.java:7: シンボルを解決できません。 シンボル: クラス Lesson1 場所 : Lesson1Applet の クラス this.add(new Lesson1("")); ^ という、エラーが出ます。 なぜコンパイル出来ないのか、わかる方がいましたら お返事お願いいたします。

    • ベストアンサー
    • Java
  • JAVAアプレット(簡易計算機)のプログラム

    足し算を行うだけのプログラムを組むことができたのですが、 四則演算を行いたいと考えています。 下記のようなプログラムでは、ボタンが=のボタンなのですが、 そのボタンを+,-,*,/の4つにおきかえて、各ボタンを押したときに 各ボタンの処理を行うのはどのようにすればいいのでしょうか? 分かる方、ご教授よろしくおねがいします。 import java.applet.Applet; import java.awt.*; // java.awtパッケージのインポート import java.awt.event.*; public class SampleD10L2 extends Applet { private Button btn_culc; // +ボタン private TextField txt_A, txt_B, txt_answer; // 数値入力用テキストボックス public void init() { // ボタンのインスタンスを作成 btn_culc = new Button("="); // ボタンのイベント処理を定義 btn_culc.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { // txt_Aに入力された値 + txt_Bに入力された値を計算 int intAnswer = Integer.parseInt(txt_A.getText()) + Integer.parseInt(txt_B.getText()); // 答えをtxt_answerに表示 txt_answer.setText(Integer.toString(intAnswer)); } }); // コンポーネントの初期化 txt_A = new TextField("0", 3); txt_B = new TextField("0", 3); lbl_plus = new Label(" + "); txt_answer = new TextField("0", 5); // コンポーネントを追加 this.add(txt_A); // 自分自身のaddメソッドを呼び出す(this.は省略可能) this.add(lbl_plus); this.add(txt_B); this.add(btn_culc); this.add(txt_answer); } }

    • ベストアンサー
    • Java
  • HTMLファイルを開きたい

    こんにちは、いつもお世話になっています。 質問があります。 アプレットでボタンを押すと、 HTMLファイル「c:/test_folder/test.html」 を開きたいのですが、 下記コードの(☆) のところに何を書いていいかわかりません。 どなたかご存知でしたら教えていただけないでしょうか? よろしくお願いします。 ============================================================= import javax.swing.*; import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.net.*; public class situmon extends Applet implements ActionListener { JPanel panel; JButton button; public void init() { panel=new JPanel(); button=new JButton("次へ"); button.addActionListener(this); panel.add(button); this.add(panel); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { (☆); } } }

    • ベストアンサー
    • Java
  • アプレットでボタンを押したときの処理について質問です。

    JAVAで2つのクラスを作成しました。 1つは初期画面で「入力」「検索」等と言ったボタンを持ち、ボタンを押されると別の画面に切り替えるクラスです。もう1つは初期画面で「入力ボタン」を押されて表示する画面のクラスです。 初期画面でボタンが押されたときの処理を次のようにしました。 public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.equals("入力")){ Input input = new Input(); } ですが、Inputクラスの画面が表示されません。 Inputクラスのソースは import java.awt.*; import java.awt.event.*; import java.applet.*; /* <applet code="Input" width=250 height=250> </applet> */ public class Input extends Applet { Panel panel; TextArea textarea; public void init()//部品を初期化する { panel = new Panel(); textarea = new TextArea(); setLayout(new BorderLayout()); add(textarea,BorderLayout.CENTER); add(panel,BorderLayout.SOUTH); } } です。ボタンを押された時のイベントを受け取るまでの処理は正しいと思うのですが、どのように改良すればよろしいでしょうか?

    • ベストアンサー
    • Java
  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • java アプレット

    学校の授業でアプレットを学んでいます。 しかし・・・ 下のプログラムで、計算した結果をlabel3にはりつけたいのですが、計算結果がでてくれません・・・ボタンを押しても何もでてきません。 コマンドプロンプトで、エラーはでてきません。 お手数ですが、誰かどこがいけないのか教えて下さい。 import java.awt.*; import java.awt.event.*; public class B extends java.applet.Applet implements ActionListener { Label label3 = new Label(); Button button2 = new Button(); TextField textfield1= new TextField(10); TextField textfield2= new TextField(10); public void init() { button2.setLabel("入力したらクリック!"); button2.setBounds(new Rectangle(50, 465, 120, 20)); this.setLayout(null); label3.setBackground(Color.blue); label3.setBounds(new Rectangle(325, 80, 200, 35)); textfield1.setBounds(100, 425, 100, 25); textfield2.setBounds(150, 350, 100, 25); this.add(textfield2, null); this.add(label3, null); this.add(textfield1, null); this.add(button2, null);} public void actionPerformed(ActionEvent event) {if(event.getSource() == button2) {int diff = Integer.parseInt(textfield1.getText()) - Integer.parseInt(textfield2.getText()); String otsuri; otsuri ="お釣りは"+ diff +"円です。"; label3.setText(otsuri);} }} よろしくお願いします。

    • ベストアンサー
    • Java
  • アプレットと自作パッケージのimportについて

    以下のような、アプレットのプログラムを作ったのですが、コンパイルは通るのですが、アプレットの初期化のところで止まってしまいます。理由と解決策を教えてください。 javac dev_java\TargetApplet\*.java ← これはOK appletviewer dev_java\TargetApplet\TargetApplet.java ←init() で止まる。 (ソース一部抜粋) package dev_java.TargetApplet ; import java.applet.* ; import java.awt.* ; import java.awt.event.* ; import dev_java.Target.* ;  // 自作のpackage /* <applet code="TargetApplet" width=500 height=400> </applet> */ public class TargetApplet extends Applet implements ActionListener, TextListener{ TextField Word ; TextField Mean ; TextArea Result ; Button Search ; Button Entry ; EnglishDictionary ed ; /* 自作package dev_java.Target で宣言されているクラス*/ public void init() { Word = new TextField(20) ; Mean = new TextField(20) ; Search = new Button("Search") ; Entry = new Button("Entry") ; Result = new TextArea(20,40) ; Word.addActionListener(this) ; Word.addTextListener(this) ; Mean.addActionListener(this) ; Mean.addTextListener(this) ; Search.addActionListener(this) ; Entry.addActionListener(this) ; // EnglishDictionary ed = new EnglishDictionary("dic/Target1900.dic") ; this.add(Word) ; this.add(Mean) ; this.add(Search) ; this.add(Entry) ; this.add(Result) ; } }

    • ベストアンサー
    • Java
  • アプレットのパスワード認証

    JAVAアプレットでパスワード認証を作成したいのですが、正しいパスワードを入力しても指定したページにリンクされません。 定義方法が間違っているのでしょうか?? どなたでもかまいませんので教えて下さい。 import java.applet.Applet; import java.awt.*; import java.net.*; import java.applet.AppletContext; import javax.swing.*; import java.awt.event.*; import java.net.MalformedURLException; public class password extends Applet { URL url; Color bgcolor; public void init() { TextField password =new TextField(15); Button b =new Button("認証"); add(password); add(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String pw = password.getText(); String pass = "test"; String strURL = "test11.html"; if(pw.equals(pass)){ try{ URL url = new URL(strURL); getAppletContext().showDocument(url,"_blank"); }catch(MalformedURLException ex){ showStatus("URLエラー"); } }else{ setBackground( Color.red); repaint(); password.setText("パスワード エラー"); } } }); } }

    • ベストアンサー
    • Java
  • アプレットで簡単な絵を描きたい

    drawLineメソッドを使用してマウスで絵を描きたいのですがうまくいきません。どうすればいいでしょうか? 一応私が途中まで考えたソースを下に載せておきます。 できればこのソースを変更して完成できればよく理解できるのでよろしくお願い致します。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics2 extends Applet implements MouseListener{ private int startX; private int startY; private int startX2; private int startY2; private boolean flg; public void init(){ addMouseListener(this); } public void mouseClicked(MouseEvent e){ } public void mousePressed(MouseEvent e){ flg = true; startX = e.getX(); startY = e.getY(); } public void mouseReleased(MouseEvent e){ flg = false; } public void mouseMoved(MouseEvent e){ System.out.println(flg); if(flg == true){ System.out.println(flg); startX2 = e.getX(); startY2 = e.getY(); repaint(); startX = e.getX(); startY = e.getY(); } } public void mouseEntered(MouseEvent e){} public void update(Graphics e){ e.drawLine(startX, startY,startX2, startY2); } public void mouseExited(MouseEvent e){} }

    • ベストアンサー
    • Java