- - PR -
java.awt.Windowを継承したクラスで"keyTyped"イベントを取得するには?
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-01-26 13:45
テスト環境
・Windows2000 ・JBuilder 8 ・JDK 1.4 java.awt.Windowを継承したクラスを作成し、"keyTyped"イベントを取得したいのですが 上手くいきません。 キーが入力されたら"key type"を出力したいのですが"void this_keyTyped(KeyEvent e)"メソッドに処理が着ません。 マウスクリックイベントは問題なく取得できているのですが・・・ public class Main_Window extends Window{ public Main_Window() { super(new Frame()); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.setSize(new Dimension(217, 300)); this.addMouseListener(new Main_Window_this_mouseAdapter(this)); this.addKeyListener(new Main_Window_this_keyAdapter(this)); this.setLayout(null); } void this_mouseClicked(MouseEvent e) { System.out.println("click"); } void this_keyTyped(KeyEvent e) { System.out.println("key type"); } } class Main_Window_this_keyAdapter extends java.awt.event.KeyAdapter { Main_Window adaptee; Main_Window_this_keyAdapter(Main_Window adaptee) { this.adaptee = adaptee; } public void keyTyped(KeyEvent e) { adaptee.this_keyTyped(e); } } class Main_Window_this_mouseAdapter extends java.awt.event.MouseAdapter { Main_Window adaptee; Main_Window_this_mouseAdapter(Main_Window adaptee) { this.adaptee = adaptee; } public void mouseClicked(MouseEvent e) { adaptee.this_mouseClicked(e); } } | ||||||||
|
投稿日時: 2004-01-27 00:47
takaさん、こんにちは。
WindowにFocusが与えられて無いからではないでしょうか? | ||||||||
|
投稿日時: 2004-01-27 04:10
こんにちは、さくらばです。
なぜ、Window クラスを使用するのでしょうか。Frame クラスを Undecorated にすればいいと思うのですが。そうすればタイトルバーなどは表示されないので 見かけは Window クラスと同じですが、イベントを取得することができます。 コンストラクタと jbInit メソッドを次のように直してやってみてください。
| ||||||||
|
投稿日時: 2004-01-27 08:11
Kissingerさん、さくらばさんご意見ありがとうございます。
Kissingerさん >WindowにFocusが与えられて無いからではないでしょうか? マウスクリックイベント処理内で下記のようにフォーカス情報を出力してみました。 void this_mouseClicked(MouseEvent e) { System.out.println("is Focusable " + this.isFocusableWindow()); System.out.println("is Focused " + this.isFocused()); } すると is Focusable false is Focused false のように出力され、Kissingerさんのおっしゃる通りフォーカスが取得できていませんでした。 では、どのようにすればフォーカスを取得でき&KeyTypeイベントを取得できるのでしょう? さくらばさん >なぜ、Window クラスを使用するのでしょうか。 参考ソースまで提示していただき、ありがとうございました。 実は開発環境ではJDK1.4を使えるのですが、実機ではJDK1.2なのです。 FrameクラスのsetUndecoratedメソッドはJDK1.4からなので使用できません。 私の説明不足です、申し訳ありません。 Windowクラスでは無理な事なのでしょうか? | ||||||||
|
投稿日時: 2004-01-27 13:33
こんにちは、さくらばです。
それは残念ですね。
できないことはないかもしれませんが、かなり大変だと思います。 というのも Window クラスがフォーカスを取れるかどうかは isFocusableWindow メソッドで判定しています。isFocusableWindow では owner が表示されている 時に true が戻るようになっています。 今回の場合は owner であるフレームはインスタンス化しているだけで、表示は されていません。そのため、フォーカスが取れなくなってしまっているのです。 それでは、isFocusableWindow をオーバーライドしてしまえばいいかというと、 このメソッドは final なのでそれもできません。 とすると、できるのは Window クラスに似て非なるものを自作するしかないと いうことになってしまいます。これは大変ですよ # フレームを表示して、アイコン化しておくなどという手もあるとは思いますが... | ||||||||
1
