プロが教える店舗&オフィスのセキュリティ対策術

 キーリスナーが上手く使えないでいます。
 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();
}
}

 このプログラムでは、ダブルのスラッシュを附けてボタンの貼り附けを止めています。この形で実行すればキーリスナーは働くのです。しかしスラッシュを取ってボタンを貼り附けると、マウスリスナーだけが有効になってキーリスナーは失効します。両立しません。リスナーを二つの内部クラスに分けて使うなど多少の工夫はしてみましたが、上手く行きません。
 どうすれば両方のリスナーが使えるようになるでしょうか。

A 回答 (1件)

>addKeyListener(this);



となっているから、キーリスナーはFrameに対して行っていますね。

ボタンを張るとフォーカスがフレームからボタンに移りますので、キーはボタンに対して行われるためイベントを受け取れないのだと思います。

ボタンに対してキーリスナーを追加すれば解決すると思います。
    • good
    • 0
この回答へのお礼

 迅速かつ明快な回答有難うごさいました。早速書き換えて実行しましたところ、見事に両メッセージがコマンドプロンプトに出力されました。感謝します。

 実は今19音階の鍵盤楽器を(自分の楽しみの為に)作っています。普通12個の鍵が並んで1オクターブになりますが、それが19個あるのです。音は上手く出ました。しかし1オクターブでは音域が狭すぎます。と言って 19×2+1=39 個の鍵を並べて2オクターブにすれば、帯を解いたようになってしまいます。そこで Ctrl キーを押しながら鍵を押せば倍音が出るようにしようと考えて実行しました所、キーリスナーが効かなかったのです。
 多少面倒ではありますが全ての鍵にキーリスナーを附けることに致します。首尾良く2オクターブ出ることと存じます。有難うございました。 

お礼日時:2006/02/02 17:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!