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 言語に詳しい方、もし何かご存知でしたら教えて下さい。
(なお、省略した部分は普通の計算処理とかなので影響はないと思われます。)
No.1ベストアンサー
- 回答日時:
うーん、ディスパッチスレッド(イベントを処理しているスレッド)と、
メインスレッド(mainメソッドが動作しているスレッド)が異なっているからでは?
awtの仕組みの問題ですね。
processMouseEventの中などからmainLoopを呼び出すとGUIがフリーズすると思います。
試しに、mainLoopの先頭(whileの直前)と、processMouseEventメソッドの先頭で
System.out.println("メソッド名:" + Thread.currentThread().getName());
と入れて、それぞれのメソッドを実行しているスレッドを確認すると分かります。
回答ありがとうございます。
それぞれのメソッドでスレッド名を表示させてみたところ、
メインループでは main と表示され、
processMouseEvent メソッドでは AWT-EventQueue-0 と表示されました。
スレッドが違っているという事を確認し、納得しました。
ありがとうございました。
No.2
- 回答日時:
以前、同じことでひっかかったことがあります。
下の方がおっしゃっているように、スレッドが違うのです。
JavaのGUI(awt)では、最初のウィンドウ(フレーム)が生成された時点で、勝手に新しいスレッドが作られ、そのスレッドがイベントをディスパッチする仕組みになっています。ですので、ウィンドウの生成を行ったスレッドが無限ループに入っても、それとは関係なくウィンドウのイベントはディスパッチされます。
この部分はWinAPIなんかとは挙動が違いますので、Windowsでのプログラミングに慣れている人ほど引っかかるかも知れませんね。
回答ありがとうございます。
Java は DoEvents しなくてもメインループできて便利ですね。
今後、この便利なスレッド機能についてもっと勉強するつもりです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java Java 配列<選挙> 4 2023/07/31 15:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaでVBのDOEVENTSと同様の処...
-
doGetとdoPostの違い
-
tomcat(struts)で起動時に処理...
-
GASで、起動時間の最大値を超え...
-
C#のスレッド動作について
-
[Java] while(true)の意味
-
データ未入力時のエラー処理が...
-
DBのinsert/updateを1ボタンで...
-
エクセルVBAで、条件に一致する...
-
同一パッケージにあるクラスが...
-
「天声人語」をインターネット...
-
「タイプ初期化子が例外をスロ...
-
配列の重複する値とその個数を...
-
インスタンス参照でアクセスで...
-
エクセルのマクロでプリンタを...
-
Javaのメモリの管理
-
変数名の付け方
-
同じクラスにならない確率を教...
-
Labelコントロールの背景をグラ...
-
C#において、同じインスタンス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
doGetとdoPostの違い
-
Javaプログラムからポップアッ...
-
SwingUtilities.invokeLater(ne...
-
Javaでのデバッグコード削除
-
Tomcat高負荷時の設定について
-
JavaScriptからJAVAクラスを呼...
-
データ未入力時のエラー処理が...
-
アコーディオンメニューをアン...
-
ブラウザを閉じた後のサーバ側...
-
[Java] while(true)の意味
-
数値の定数を付ける時
-
Javaアプリケーション実行の返...
-
ラジオボタンの選択判定
-
スレッド1とスレッド2を交互に...
-
WPF C#でF10のイベント取得方法...
-
onBlurとonFocusの処理順序につ...
-
flush()メソッドについて・・・
-
ExcelVBA で文字列の特定の文字...
-
Java ファイルが生成させたか確...
おすすめ情報