os windows 7
eclipseで上下左右のキーとその他のキーを押した時、ウィンドウ下部に入力したキーを表示するアプレットを作りました。
しかし実行はできたのですが、キーを入力しても
下部に入力したキーが表示されません。
コードが間違えているのでしょうか?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Sample7 extends JApplet{
private JLabel lb1, lb2;
public void init(){
//コンポーネントの作成
lb1 = new JLabel("矢印キーをお選びください。");
lb2 = new JLabel();
//コンテナへの追加
add(lb1, BorderLayout.NORTH);
add(lb2, BorderLayout.SOUTH);
//リスナの登録
addKeyListener(new SampleKeyListener());
}
//リスナクラス
class SampleKeyListener extends KeyAdapter{
public void keyPressed(KeyEvent e){
String str;
int k = e.getKeyCode();
switch(k){
case KeyEvent.VK_UP:
str = "上";break;
case KeyEvent.VK_DOWN:
str = "下";break;
case KeyEvent.VK_LEFT:
str = "左";break;
case KeyEvent.VK_RIGHT:
str = "右";break;
default:
str = "他のキー";
}
lb2.setText(str + "ですね。");
}
}
}
KeyListenerが登録されたコンポーネント(この場合だとSample7オブジェクト)がフォーカスを所有していないのでキーイベントがリスナに通知されないのだと思います。
適切な対処方法はよく分かりませんが、例えばinit()の最後に
addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { requestFocusInWindow(); } });
を追加すると、意図したように動くのではないでしょうか。
コメント(1件)
requestFocusInWindow()メソッドを用いることまでは自力でわかったのですが、
どの部分に書き込めばよいかわからず困っていました。
余談ですが、オーバーライドの行い方にこのような方法があることも始めて知りました。
助けになると同時に勉強になりました。
ありがとうございました。