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ランキング
-
tryの終了
-
DBのinsert/updateを1ボタンで...
-
ftp 同時複数接続の負荷テスト...
-
SwingUtilities.invokeLater(ne...
-
スレッド1とスレッド2を交互に...
-
WaitForSingleObjectの復帰時間
-
JavaScriptからJAVAクラスを呼...
-
doGetとdoPostの違い
-
[Java] while(true)の意味
-
Tomcat高負荷時の設定について
-
Javaでのデバッグコード削除
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
オブジェクト指向プログラミン...
-
生成したインスタンスを削除す...
-
変数名の付け方
-
servletからjspへオブジェクト...
-
レコード件数の表示
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
数値の定数を付ける時
-
Javaでのデバッグコード削除
-
C#で別スレッドの終了を知りたい
-
[Java] while(true)の意味
-
Tomcatのスレッドを破棄する方法
-
Javaプログラムからポップアッ...
-
ラジオボタンの選択判定
-
JavaScriptからJAVAクラスを呼...
-
WPF C#でF10のイベント取得方法...
-
PHPでDB処理中にプログレスバー...
-
素数判定を再帰処理で
-
Javaアプリケーション実行の返...
-
switch文の中に、throws new Ex...
-
doGetとdoPostの違い
-
JDBCでテーブルUPDATE後の再検...
-
Tomcat高負荷時の設定について
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
SwingUtilities.invokeLater(ne...
おすすめ情報