- ベストアンサー
無限ループ中におけるマウスイベント処理について
import java.awt.*; import java.awt.event.*; //他のインポートは省略。 public class Test extends Frame { public static void main(String[] args) { new Test(); } public Test() { //フレームの基本設定は省略。 enableEvents(AWTEvent.MOUSE_EVENT_MASK); show(); mainLoop(); } private void mainLoop() { while(true) { //処理は省略。 } } public void processMouseEvent(MouseEvent e) { //処理は省略。 } //他のメソッドは省略。 } こんな感じのプログラムを作ったのですが、mainLoop メソッドの無限ループにはまって何もできなくなるはずが、 なぜか普通にマウスイベント処理ができたので不思議に思っております。 VB などで同じようなプログラムを作るときは無限ループの最後に DoEvents でイベント処理をさせております。 言語仕様なのか自分の使ってる PC や OS など環境のせいなのが気になっております。 Java 言語に詳しい方、もし何かご存知でしたら教えて下さい。 (なお、省略した部分は普通の計算処理とかなので影響はないと思われます。)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
うーん、ディスパッチスレッド(イベントを処理しているスレッド)と、 メインスレッド(mainメソッドが動作しているスレッド)が異なっているからでは? awtの仕組みの問題ですね。 processMouseEventの中などからmainLoopを呼び出すとGUIがフリーズすると思います。 試しに、mainLoopの先頭(whileの直前)と、processMouseEventメソッドの先頭で System.out.println("メソッド名:" + Thread.currentThread().getName()); と入れて、それぞれのメソッドを実行しているスレッドを確認すると分かります。
その他の回答 (1)
- kyopeta
- ベストアンサー率0% (0/1)
以前、同じことでひっかかったことがあります。 下の方がおっしゃっているように、スレッドが違うのです。 JavaのGUI(awt)では、最初のウィンドウ(フレーム)が生成された時点で、勝手に新しいスレッドが作られ、そのスレッドがイベントをディスパッチする仕組みになっています。ですので、ウィンドウの生成を行ったスレッドが無限ループに入っても、それとは関係なくウィンドウのイベントはディスパッチされます。 この部分はWinAPIなんかとは挙動が違いますので、Windowsでのプログラミングに慣れている人ほど引っかかるかも知れませんね。
お礼
回答ありがとうございます。 Java は DoEvents しなくてもメインループできて便利ですね。 今後、この便利なスレッド機能についてもっと勉強するつもりです。 ありがとうございました。
お礼
回答ありがとうございます。 それぞれのメソッドでスレッド名を表示させてみたところ、 メインループでは main と表示され、 processMouseEvent メソッドでは AWT-EventQueue-0 と表示されました。 スレッドが違っているという事を確認し、納得しました。 ありがとうございました。