KeyListenerの使い方について

このQ&Aのポイント
  • KeyListenerを使用してキー入力を受け付ける方法についての質問です。
  • フレームにKeyListenerを登録してもキー入力が反応しない問題が発生しています。
  • キー入力によりリストボックスの項目が入れ替わる現象も発生しています。
回答を見る
  • ベストアンサー

KeyListenerの使い方について

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

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

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

  • ベストアンサー
  • koki_m
  • ベストアンサー率83% (45/54)
回答No.1

こんにちは。 おそらくフォーカスの問題だと思います。 フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。 - - - import java.awt.*; import java.awt.event.*; public class Test extends KeyAdapter { Frame frame; List list; public static void main(String args[]) { new Test(); } public Test() { list = new List(); list.add("apple"); list.add("orange"); list.add("banana"); list.removeKeyListener(this); frame = new Frame("Test"); frame.add(list); frame.setSize(400, 300); frame.setLocation(100, 100); frame.addKeyListener(this); frame.show(); frame.requestFocus(); // フレームにフォーカスを設定 } public void keyPressed(KeyEvent e) { System.out.println("key pressed."); } }

関連するQ&A

  • Java バックグラウンドでキーを監視したい

    Swingを使用しています。ウィンドウにフォーカスが外れても、どのキーが押されたか判定できる方法を教えて下さい。 フォーカスがあっていれば、動作するプログラムは作れました。 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class KeyListenerOnBackgroundTest extends JFrame implements KeyListener{ public KeyListenerOnBackgroundTest() { setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); addKeyListener(this); } public static void main(String[] args){ new KeyListenerOnBackgroundTest().setVisible(true); } @Override public void keyPressed(KeyEvent e) { // 文字とコードを表示する System.out.println(e.getKeyCode()+":"+e.getKeyChar()); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) { } }

    • ベストアンサー
    • Java
  • TABキーの検出

    Swingコンポーネントで、TABキーのイベントを取得する 方法を教えてください。 タブキー以外は検出できるのですが… import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class TabKeyListener { public TabKeyListener() { JPanel panel = new JPanel(); panel.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } ); JFrame frame = new JFrame(); frame.add(panel); frame.setBounds(100,100,200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); panel.requestFocusInWindow(); } public static void main(String[] args) { new TabKeyListener(); } }

    • ベストアンサー
    • Java
  • JavaSwingのファンクションキーのイベント

    JavaのSwingでファンクションキーのイベントをひろいたいの ですが、F10キーやF12キーで思うようにイベントをひろえま せん。 たとえば下のように書いて、フレームにフォーカスがあるときボ タンを押すとカウントが増えていくものを作ったとき、アルファベ ットやほかのFキーならスムーズにカウントされていくのにF10は 2回に1回しかカウントされず、F12だと途中で反応したりしなか ったりします。 この原因と対処法を知っているひとがいたら教えてください。 よろしくお願いします。 public class WindowTest extends JFrame implements KeyListener{ public static int intKeyPress =0; JLabel lbl = new JLabel("0"); public static void main(String[] args) { WindowTest w = new WindowTest(); } public WindowTest() { addKeyListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(320, 160); this.add(lbl); this.setLocationRelativeTo(null); this.setVisible(true); } @Override public void keyPressed(KeyEvent e) { lbl.setText(String.valueOf(intKeyPress++)); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} }

    • ベストアンサー
    • Java
  • JAVA コンパイル時のエラー

    JAVAの初心者です。 javacでコンパイルする際, gui は abstract でなく、java.awt.event.KeyListener 内の abstract メソッド keyReleased(java.awt.event.KeyEvent) をオーバーライドしません。 public class gui extends JFrame implements ActionListener,KeyListener { このようなエラー文がでます。 このエラー文の意味を教えていただけないでしょうか。 よろしくお願いします。

  • javaのrepaint()について

    Java初心者です。 現在、アニメーションで少々つまずいています・・・ソースは以下の通りです。 import java.awt.*; import java.awt.event.*; public class test04 extends Frame implements KeyListener { public int x = 10, y = 10; public static void main(String[] args) { new test04(); } test04() { super("KeyFrameTest"); //フレーム名 setSize(200, 200); //フレームサイズを設定 MyCanvas mc = new MyCanvas(); mc.addKeyListener(this); add(mc); setVisible(true); //フレームを表示 addWindowListener(new Close()); //クローズ処理 } /*** キーが押されているとき ***/ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case 37: //← x--; break; case 38: //↑ y--; break; case 39: //→ x++; break; case 40: //↓ y++; break; } System.out.println("(" + x + "," + y + ")"); } /*** キーが離されたとき ***/ public void keyReleased(KeyEvent e) { } /*** キーが押された瞬間 ***/ public void keyTyped(KeyEvent e) { } /*** キャンバス用クラス ***/ class MyCanvas extends Canvas { /*** 描画ステータス ***/ public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(x, y, 20, 20); repaint(); } /*** ペイント処理 ***/ //勝手に点滅するのを回避するため public void update(Graphics g) { paint(g); } } } /*** クローズクラス ***/ class Close extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } /*** スリープクラス ***/ class Sleep extends Thread { public void Sleep(long milli) { try { Thread.sleep(milli); } catch(Exception e) { } } } ↑のプログラムを実行すると、押したキーに対応する動作はするのですが、 前に描画した残像が残ってしまい、上手くいきません・・・repaint()の位置を変えてみたり したら、今度はボックスが動かなくなってしまい、訳が分からなくなって来ました・・・何故 上手くいかないんでしょうか? 理想的な動作としては、押したキーに対応した動作をし、残像も残らないようにしたいです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • 途中でキーイベントが働かなくなる。

    javaを勉強している者です。 KeyListenerとActionListenerをインターフェースにして、keyPressedメソッドと、actionPerformedにいくつか機能を実装しているのですが、actionPerformedメソッドが動く前は、keyPressedメソッドがちゃんと動くのですが、actionPerformedメソッドを動かしてからだと、keyPressedが動かなくなる(キーを押しても反応しなくなる)のですが、何かよくある原因というのはあるのでしょうか?(keyPressedのようなメソッドが途中で動かなくなることに) やはりコードを見ないとなんとも言えないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • keyPressedメソッド

    ブロック崩しのゲームをjavaでつくっているのですが、パドルを矢印キーで滑らかにうごかしたいのですが、滑らかに動かせません。 KeyListenerを実装したクラスをつくり、そのクラスのkeyPressedメソッドでパドルの位置を変化させるのですが、実行してみると、パドルの動きが鈍いです。 矢印キーを最初に押したときの反応は速いのですが、キーを押し続けた場合、一瞬ためらってからパドルが動きます。 原因は、キーを押し続けた場合、1回目のkeyPressedメソッドの呼び出しから、2回目の呼び出しまでの時間間隔が長いからだと思います。 この時間間隔を短くする方法は、ありますか? または、矢印キーで滑らかに動かす他の方法がありましたら教えてください。

    • ベストアンサー
    • 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
  • (長文です。すみません。)repaintをコードに書いてもupdateが実行されなくて困ってます。

    わざわざ見て下さってありがとうございます! マルチスレッドのアプレットを作っています。全部書くと多すぎるので、およそのものを書きました。 ●●●●プログラム本体開始●●●● public class RPG extends Applet implements Runnable ,KeyListener {    「いくつかのフィールド」  public void init(){    「中略」   RPG hero = new RPG();   Thread heroStep = new Thread(hero);   heroStep.start();   addKeyListener(this);  }  public void run(){   while(true){    try{     Thread.sleep(300);    }    catch(Exception e){}    System.out.println("リペイント直前")    repaint();    System.out.println("リペイント通過");   }  }  public void update(Graphics g){   System.out.println("アップデイト実行");   paint(g);  }  public synchronized void paint(Graphics g){   System.out.println("ペイント実行");    「中略」  }  public void keyPressed( KeyEvent e ){    「中略」   repaint();  }  public void keyTyped(KeyEvent e){}  public void keyReleased(KeyEvent e){} } ●●●●プログラム本体終了●●●● うまく動かなくて困っています。repaintは、キー入力をした時と、0.3秒毎にheroStepから呼び出される事にしたいのです。キー入力の場合は確実に実行されているのですが、0.3秒毎の方は全然実行してくれないのです。 コンソールを見ると、 リペイント直前 リペイント通過 と、毎回「アップデイト実行」「ペイント実行」が出力されないのです。何がいけないのでしょうか? 万が一、大切な部分を省略していたり、不足の部分がございましたら、教えて頂ければ追加で掲載致します。 どうか宜しくお願い致します。

    • ベストアンサー
    • Java
  • KeyListenerをButtonコンポーネントに追加

    ある問題集の問題なのですが、 どういうことなのかほとんどわかりません・・・ 問.KeyListenerをButtonコンポーネントに追加する際の説明として正しいのはどれですか。 a.キーイベントとマウスクリックイベントを有効にするためには、ButtonオブジェクトのenablEvents()メソッドを呼び出して定義をわたさなければならない。(×) b.ButtonオブジェクトのenableEvents()メソッドを呼び出し、定数AWTEvent.KEY_EVENT_MASKを渡さなければならない。(×) 解説.addkeyListener()メソッドはCompornentクラスに含まれているので、すべてのAWTコンポーネントにKeylistenerを追加することができます。したがって、選択肢a,bは間違いです。 ということなんですが、解説を読んでもよくわかりません。 もう少しわかりやすく教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう