- PR -

java.awt.Windowを継承したクラスで"keyTyped"イベントを取得するには?

1
投稿者投稿内容
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 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);
 }
}
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-01-27 00:47
takaさん、こんにちは。

WindowにFocusが与えられて無いからではないでしょうか?
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-01-27 04:10
こんにちは、さくらばです。

引用:

takaさんの書き込み (2004-01-26 13:45) より:
java.awt.Windowを継承したクラスを作成し、"keyTyped"イベントを取得したいのですが
上手くいきません。



なぜ、Window クラスを使用するのでしょうか。Frame クラスを Undecorated
にすればいいと思うのですが。そうすればタイトルバーなどは表示されないので
見かけは Window クラスと同じですが、イベントを取得することができます。

コンストラクタと jbInit メソッドを次のように直してやってみてください。

コード:
public class Main_Window extends Frame {   // 変更
    public Main_Window() {
	super("");   // 変更
	enableEvents(AWTEvent.WINDOW_EVENT_MASK);
	try {
	    jbInit();
	}
	catch(Exception e) {
	    e.printStackTrace();
	}
    }
    
    private void jbInit() throws Exception {
	this.setUndecorated(true);             // 追加
	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);
    }



taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 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クラスでは無理な事なのでしょうか?


さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-01-27 13:33
こんにちは、さくらばです。

引用:

takaさんの書き込み (2004-01-27 08:11) より:

実は開発環境ではJDK1.4を使えるのですが、実機ではJDK1.2なのです。



それは残念ですね。

引用:

Windowクラスでは無理な事なのでしょうか?



できないことはないかもしれませんが、かなり大変だと思います。

というのも Window クラスがフォーカスを取れるかどうかは isFocusableWindow
メソッドで判定しています。isFocusableWindow では owner が表示されている
時に true が戻るようになっています。

今回の場合は owner であるフレームはインスタンス化しているだけで、表示は
されていません。そのため、フォーカスが取れなくなってしまっているのです。

それでは、isFocusableWindow をオーバーライドしてしまえばいいかというと、
このメソッドは final なのでそれもできません。

とすると、できるのは Window クラスに似て非なるものを自作するしかないと
いうことになってしまいます。これは大変ですよ

# フレームを表示して、アイコン化しておくなどという手もあるとは思いますが...
1

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