• ベストアンサー

EventListenerの実装について

次の様なプログラムを書きました。 class listener implements KeyListener{ String TypedKeyName; .... } 勿論必要なmethodは全て記述しました。TypedKeyNameには入力された キーの名前を保存します。 次に、Appletクラスを拡張し、Runnableをimplementsしたクラスを 作成して、その中でlistenerのインスタンスlis_insを作り、 addKeyListener(lis_ins); としました。run()の中で永久ループにしてTypedKeyNameの値をpaint()にて 表示させようと思ったのですが、上手くいきません(全く更新されません)。 参考書には addEventListener(this); とばかり載っているのですが、ひょっとして、Componentクラスを 継承していないとリスナーには指定出来ないのでしょうか? 分かり難い質問で申し訳ありません。

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

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

  • ベストアンサー
  • yogawa
  • ベストアンサー率66% (4/6)
回答No.2

paintの方には問題がない(本当にKeyEventが発生していない)と仮定して書いてみます。 Appletにフォーカスは当たっているでしょうか? すべてのバージョンでそうなのか分かりませんが、うちのappletviewerで動かした場合、AppletがrequestFocusしてやらないとフォーカスが来ないようです。 IE5上で実行すると、最初からフォーカスが当たっているみたいですが。 Componentクラスを継承していないとリスナーには指定出来ない、ってことはありません。

naoto_goo
質問者

お礼

回答有難うございます。無事動かす事が出来ました。 原因は二つありました。一つはご指摘の通りFocusが当たっていなかった事。 それからもう一つの原因なんですが・・御免なさい! 実はinit()内でスレッドのインスタンスを作り、start()させるのを 忘れていました。いくらrun()を記述しようと、スレッドが動いていなければ repaint()が呼び出されるわけがありませんでした。 こんな初歩のミスで、しかもそれに気づく事なく安易に質問してしまい、 申し訳ありませんでした。 そして改めて、親切に教えて頂いて有難うございました。

その他の回答 (1)

noname#2875
noname#2875
回答No.1

失礼ですが、ちょっと状態がよくわからないので質問させてください。 paint()はうまくうごいているのですか? keyEvent以外の方法でキックしてみたら期待通りに動くのでしょうか。 イベント受け取ったさきで実行するメソッドに System.out.println("xxx"); いれてコンソール表示みてみて、 コンソールにxxxが表示されていないようなら 「キーイベントが正しくわたっていない」 xxxは表示されているならイベントの問題ではない、 ということになるとおもうのですが…

naoto_goo
質問者

お礼

回答有難うございます。動かない理由は自分のつまらないミスでした。 スレッドを動かすのを忘れていたのです。全く見当違いな所に疑いを持って いました。 System.out.println("xxx"); 成る程、appletviewerを使っている場合、そうすればデバッグに 活用する事が出来ますね。目から鱗が落ちました。 改めて、有難うございました。

関連するQ&A

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • KeyListenerの使い方について

    FrameクラスのフレームにKeyListenerをaddKeyListenerで登録してキー入力を受け付けたいのですが、キーを入力してもまったく反応がありません。どうやらkeyTyped,keyPressed,keyReleasedのどのメソッドも呼び出されてないようです。クラスの概要は以下のとおりです。 class sampleFrame extends Frame implements KeyListener { { addKeyListener(this);//コンストラクタ内で登録 } で、keyPressedとうのメソッドはすべて定義しています。それから、キーを入力するとなぜか同じフレーム上のリストボックスの項目が入れ替わったりします。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • マルチスレッドの実装について

    只今、数冊の本を読み、現在マルチスレッドの部分を やっているのですが、 参考本AとBには class Sample extends Thread { というやり方が書いてあり、 参考本Cには class Sample implements Runnable { というやり方だけ書いてあります。 どういう事だと思い、クラスリファレンス本を読んでみると、 『マルチスレッドプログラミングを行う際にはthreadを継承するか、Runnableインターフェイスを実装します』 とだけ記述されていました。 参考本AとBは2002年に発行・改訂されており、「extends Thread」の説明しか載っていませんでした。 参考本Cは2000年発行で改訂はされていません。 Q:この2つは使い分けのようなものがあるのでしょうか?

    • ベストアンサー
    • Java
  • Appletを利用したマルチスレッドプログラミング

    現在JavaのAppletを利用したマルチスレッドのプログラミングを行っているのですが、なかなか思うように行きません。 やりたいのは同じクラスを持つインスタンスをそれぞれスレッドで動かし、それぞれ個別に操作を与えたいのです。 例えばこのサイトのページではボール1、ボール2をそれぞれ作成していますが、もう少し汎用化したいのです。 http://www.mm2d.net/applet-howto/howto-07.shtml 例えばAppletで動かすSampleBallクラスのインスタンスを複数作成し、 それぞれスレッドで動かすにはどうすれば良いでしょうか。 別クラス(ファイル)として作成したいです。 イメージとしてはこのような感じなのですが、Main.javaを起動するとAppletが起動しません。 またそれぞれスレッドで動かすということで、任意にAppletにSampleBallクラスのインスタンスを 追加したり、削除したり、操作したりするにはどうすればよいでしょうか。 ・Main.java static void main(String args[]) {   SampleBall ball1 = new SampleBall(・・・);   SampleBall ball2 = new SampleBall(・・・);   SampleBall ball3 = new SampleBall(・・・);   … } ・SampleBall.java public class SampleBall extends Applet implements Runnable{ public SampleBall(…){ ・・・ }    public void changeColor(Color col){・・・}    … } 参考になるページ等も教えて頂ければ助かります。 どうぞよろしくお願いします

  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java
  • Javaアプレットで複数のスレッド (初心者です)

    javaアプレットで二つのスレッドを作り、それぞれからパラパラアニメ(0.4秒間隔で絵が変わるものanime1と0.7秒のものanime2)を表示させたいと考えています。 パラパラアニメ本体はhttp://www.ipc.hokusei.ac.jp/~z00104/java/anim.htmlをほぼコピーで使わせてもらい、それ単体では動かせました。 しかし二つスレッドを作るためにRunnableを実装したクラスを二つ用意して、それをまた別の一つのクラスから呼び出すことがうまくできません。 public class oshietegoo extends Applet{ anime1 aa = new anime1(); anime2 bb = new anime2(); Thread a = new Thread(aa); Thread b = new Thread(bb); a.start(); b.start(); //(スレッドの作成についてはhttp://www.tohoho-web.com/java/thread.htmを参考にしました) } class anime1 extends Applet implements Runnable{ 【中身は最初のURLのコピー】 } class anime2 extends Applet implements Runnable{ 【中身は最初URLのコピー】 } というように書いているのですが、a.start();とb.start();のところで「トークン "start" に構文エラーがあります。このトークンの後には Identifier を指定する必要があります」とエラーが出てしまいます。 色々と調べたり、インスタンスやクラスなど基本的な概念を勉強したりしたつもりなのですが、なぜエラーが出るのか分かりませんでした……。 どなたか解決法を教えていただけませんでしょうか? 初心者な質問で申し訳ないのですが、お力添えいただけると助かります。 不足があれば追記いたしますので、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 循環参照とメモリリークに関して

    次のスクリプトはメモリリークを起こしているでしょうか。 function process(listener){ return function(evt){ listener.call(evt.target,evt); }; } function addEvent(element,type,listener,useCapture){ element.addEventListener(element,type,process(listener),useCapture); } var div=document.getElementsByTagName('div')[0]; //存在するものとして addEvent(div,'click',function(){;},false); //いかにも起こしそう div.parentNode.removeChild(div); //親も存在するものとして 工夫してみたものの、やはりメモリリークするんでしょうか。 実際にaddEventListenerのlistener引数に渡されるのは、element変数を参照しない function(evt){ listener.call(evt.target,evt); }; ですが、listener変数は参照します。 そして、そのlistener変数はdiv変数(DOM)を参照するので、ここで循環するのでしょうか。 そして、以下の場合はどうなのでしょうか。。 var elements=[document.getElementsByTagName('div')[0]]; elements[0].addEventListener('click',function(){;},false); elements[0].parentNode.removeChild(elements[0]);

  • ”main”NoClassDefFoundErrorについて

    /*---------------------------------------- KeyEvent のサンプル ----------------------------------------*/ import javax.swing.*; import java.awt.event.*; import java.awt.*; public class KeyEventSample{ JFrame frame = new JFrame("KeyEventは誰が取る?"); Canvas canvas = new Canvas(); public KeyEventSample(){ canvas.setSize(200,200); frame.getContentPane().add(canvas,"Center"); frame.pack(); frame.setVisible(true); KeyListener listener1 = new KeyDealer("frame"); frame.addKeyListener(listener1); KeyListener listener2 = new KeyDealer("canvas"); canvas.addKeyListener(listener2); } public static void main(String[] args){ new KeyEventSample(); } } class KeyDealer extends KeyAdapter{ String name; public KeyDealer(String name){ this.name = name; } public void keyPressed(KeyEvent ke){ System.out.println(name + " got " + ke.getKeyCode()); } } 上記のようなソースファイルをコンパイルし、javaコマンドで起動しようとすると 下記のようなエラーが出ます。いろいろサンプルプログラムを試してみたのですが、すべて同じメッセージです。何か根本的なところでミスがあると思うのですがわかりません。誰か教えていただけないでしょうか。ちなみにSDK1.3を使用しています。 Exception in thread "main" java.lang.NoClassDefFoundError:KeyEventSample/class

    • ベストアンサー
    • Java
  • キーリスナー

     キーリスナーが上手く使えないでいます。  Ctrl キーとボタンを押せばそれぞれのメッセージが出るようなプログラムを次のように作ります。 import java.awt.*; import java.awt.event.*; public class KL extends Frame implements KeyListener, MouseListener { KL() { setLayout(null); setBounds(400,400,100,100); addKeyListener(this); addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}}); Button b=new Button(); b.setBounds(25,50,50,20); b.addMouseListener(this); // add(b); setVisible(true); } public void keyPressed(KeyEvent e) { if(e.getKeyCode()==17) {System.out.println("Ctrl キーが押されました。"); } } public void mouseClicked(MouseEvent e) { System.out.println("ボタンがクリックされました。"); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public static void main(String args[]) { KL k_listener=new KL(); } }  このプログラムでは、ダブルのスラッシュを附けてボタンの貼り附けを止めています。この形で実行すればキーリスナーは働くのです。しかしスラッシュを取ってボタンを貼り附けると、マウスリスナーだけが有効になってキーリスナーは失効します。両立しません。リスナーを二つの内部クラスに分けて使うなど多少の工夫はしてみましたが、上手く行きません。  どうすれば両方のリスナーが使えるようになるでしょうか。

    • ベストアンサー
    • Java
  • Java言語のインタフェースについて

    Java言語を学習している者です。 インターフェースについて理解できずに困っております。 ここでは、Runnableインターフェースを例にとります。 (1)正しいコード public class ThreadTest implements Runnable { public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (1)のコードは正常に動きます。 (2)間違ったコード (implements Runnableを記述しなかった場合) public class ThreadTest{ public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (2)のコードでは、 Thread th = new Thread(ins); で、 コンストラクタ―Thread(ThreadTest)は未定義です。 とエラーが出てしまいます。 確かに未定義なのですが、(1)でも定義していないように思えます。 Runnableインターフェースの働きのお陰だと言うことはわかるのですが、どういった働きによるものなのかがわかりません。 インターフェースのについて、 ・インターフェースのフィールドは必ず定数。 ・インターフェースのメソッドは必ず抽象メソッド。 ・インターフェースはインスタンスを作ることが出来ない。 ・抽象メソッドは必ず実装しなければならない。 は理解しているつもりです。 今回の質問をするに当たって、 RunnableのAPI http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Runnable.html を見たのですが、それでも理由が分からないので質問致します。 もし宜しかったら、APIの見方についてもコメントして頂けるとありがたいです。 宜しくお願いします。

    • ベストアンサー
    • Java