- PR -

KeyEventが受け取れない

1
投稿者投稿内容
show
会議室デビュー日: 2005/05/03
投稿数: 2
投稿日時: 2005-05-03 04:51
Eclipse 3.1.0
jdk1.5.0_02

こんにちわ。上の環境にてJFrame内にJMenuBarとJPanelをいくつか配置した簡単なアプリケーションを作っています。
ここでJFrameにKeyListenerをaddしたのですが全くeventを受け取りません。

同じ部分でaddしたWindowListenerは動いています。
試しにMouseListenerをaddしてみたところこれも動きません。
他にKeyEventを受け取るのはJMenuItemですが、コメントアウトした所関係ない模様。

どなたか心辺りの事ございましたら、教えていただけないでしょうか。
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-05-03 14:11
以下のソースで試してみたところ、キーイベントは取れました。
コード:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class TestKeyEvent extends JFrame implements KeyListener {
    public static void main(String[] args) {
        TestKeyEvent test = new TestKeyEvent();
        //test.getContentPane().add(new JTextArea());//コメントを外すとキーイベントはこなくなる
        test.addKeyListener(test);
        test.setSize(640, 480);
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setVisible(true);
    }
    public void keyPressed(KeyEvent e) {
        System.out.println(e);
    }
    public void keyReleased(KeyEvent e) {
        System.out.println(e);
    }
    public void keyTyped(KeyEvent e) {
        System.out.println(e);
    }
}


キーイベントは、直接JFrameに渡されるのではなく、
最初にフォーカスのある子コンポーネントに渡されて処理されます。
そのコンポーネントがキーイベントを処理しないのであれば、
その親コンポーネントに渡されます。
誰も処理しなければ順次伝播していき、最後にJFrameに渡されます。

例えば、JFrameだけならば、キーイベントは受け取れます。
しかし、以下のコメントを外すと、JTextAreaがキーイベントをすべて処理するので、
親のJFrameまではイベントが渡ってきません。

おそらく、キーイベントを処理しているコンポーネントがどこかにいるのでしょう。
show
会議室デビュー日: 2005/05/03
投稿数: 2
投稿日時: 2005-05-03 19:26
ご指摘の通り子コンポーネントのJTextAreaがEventを処理していました。
setEditableをfalseにしていたこともあって思い当たりませんでした。

初歩的な質問をしてしまって申し訳ありません。
お答え頂きありがとうございました。
1

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