- PR -

Jpanelでキーイベントを拾いたい。

投稿者投稿内容
RyoZy
会議室デビュー日: 2005/09/08
投稿数: 15
投稿日時: 2005-09-08 00:55
教えてください。
メインとなるクラスがGamenクラスをインスタンス化し、Gamenクラスのコンストラクタで
自分をキーイベントリスナーに登録しています。
 /* Gamenクラス */
 public class Gamen extends JPanel{
  /* コンストラクタ */
  public Gamen(GameApp inst){
         ・
         ・
         ・
   this.addKeyListener(          /* キーイベントリスナー登録 */
    new KeyEvtListener(this));      /* キーイベントリスナー生成 */
         ・
         ・
         ・
  }
         ・
         ・
         ・

この方法ではダメなのでしょうか。

ちなみにJpanelにボタンを追加し、そのボタンをキーイベントリスナーを登録しておき
そのボタンにフォーカスがあるときはJpanelをキーイベントリスナーに登録している
していないに関わらず、キーイベントを拾うことができます。

理想としてはJpanelのみをキーイベントリスナーに登録し、
その画面のどこにフォーカスがあろうが、フォーカスがロスとしようが、
画面がアクティブならキーイベントを拾うようにしたいのです。

ご存知の方いらっしゃいましたらおしえてください。

さと
会議室デビュー日: 2004/04/15
投稿数: 7
投稿日時: 2005-09-08 09:53
JPanelではなくて、JFrameにKeyListenerを登録すれば、
可能のような気がします。
RyoZy
会議室デビュー日: 2005/09/08
投稿数: 15
投稿日時: 2005-09-08 10:41
返答ありがとうございます。

現在のシステムにキーボードのキーを拾って、
押下されたキーによりそれそれの処理を行うという機能を
追加する為、JPanelをJFrameに変更することは厳しいのです。
JPanelではキーイベントが拾えないということでしょうか?
であれば、JPanelではキーイベントが拾えない理由を
ご存知でしたら教えてください。

試しに、
public class Gamen extends JPanel{を
public class Gamen extends JFrame{に変更したところ
コンパイルは通るのですが、アプレット画面で
「アプレットは初期化されていません。」が表示され
処理が止まってしまいました。対処法を教えていただけませんか?
さと
会議室デビュー日: 2004/04/15
投稿数: 7
投稿日時: 2005-09-08 13:16
アプレットなんですね。
引用:
JPanelではキーイベントが拾えないということでしょうか?
であれば、JPanelではキーイベントが拾えない理由を
ご存知でしたら教えてください。


わかりません。
引用:
試しに、
public class Gamen extends JPanel{を
public class Gamen extends JFrame{に変更したところ


ではなくて、そのGamenクラスを乗せる(add)している
クラス(おそらくはJAppletを継承しているクラス)に
対して、KeyListenerを登録できませんか?
RyoZy
会議室デビュー日: 2005/09/08
投稿数: 15
投稿日時: 2005-09-08 15:03
> そのGamenクラスを乗せる(add)している
> クラス(おそらくはJAppletを継承しているクラス)に
> 対して、KeyListenerを登録できませんか?
 /* Gamenクラス */
 public class Gamen extends JPanel{
  /* コンストラクタ */
  public Gamen(GameApp inst){
         ・
         ・
         ・
//   this.addKeyListener(          /* キーイベントリスナー登録 */
//    new KeyEvtListener(this));      /* キーイベントリスナー生成 */
   (GameApp)inst.addKeyListener(      /* キーイベントリスナー登録 */
    new KeyEvtListener(this));      /* キーイベントリスナー生成 */
         ・
         ・
         ・
  }
         ・
         ・
         ・
GameAppがJAppletを継承しているクラスなのですが、
JAppletに対して登録とはこういうことでしょうか?
Java初心者でよくわかっていないのです。申し訳ありません。
実行しましたがキーイベントは拾って拾ってくれなかったです。
環境はJDK1.4.1です。
さと
会議室デビュー日: 2004/04/15
投稿数: 7
投稿日時: 2005-09-08 16:46
以下は私が確認用に作成したソースです。
コード:
import javax.swing.JApplet;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

public class TestApplet extends JApplet implements KeyListener {

  public void init() {
    addKeyListener(this);
  }

  public void keyPressed(KeyEvent e) {
    char c = e.getKeyChar();
    System.out.println(String.valueOf(c));
  }

  public void keyReleased(KeyEvent e) {
  }

  public void keyTyped(KeyEvent e) {
  }

}


Javaコンソールを開き、ブラウザのアプレット領域
をクリックしてから、何かKeyを押せば、
押した文字が出力されます。

RyoZyさんの方法と違いますが、やっている事は
同じです。

RyoZy
会議室デビュー日: 2005/09/08
投稿数: 15
投稿日時: 2005-09-08 17:32
ありがとうございます。マウスクリックすることでキーイベントを拾うことができました。
大進歩です。勉強になります。
画面上にボタンがあるのですが、ボタンにフォーカスがあった場合は拾ってくれないものなんですね。
非アクティブからアクティブにした場合もアプレットをクリックしないとダメなんですね。
クリックしなくてもキーを拾ってくれるような仕組みはないのでしょうか。
ご存知ですか。

IE上で起動させるアプレットなのですが、いっそ、応用でIEのタイトルバーがアクティブなら
キーイベントを拾ってくれるような仕組みってきいたことありますか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-09-09 12:41
SDKのバージョンが何かはわからないけど、1.4以降で開発しているのなら、
panel.setFocusable(true);
で、フォーカスを与えてあげればいいんじゃないの?

1.4以前なら、パネルにFocusListener()でリスナを追加してやり、強制的にフォーカスイベントを発生させると、出来たような気がする。

イベントの投げ方は、ゴメン、わすれた。
Component#dispatchEvent()だったような
EventQueueを取得して、直接pushしたような。。。

スキルアップ/キャリアアップ(JOB@IT)