[解決済み] java.awt.EventQueue.invokeLater について解説しました。
質問
とても不思議なのですが、どうして
java.awt.EventQueue.invokeLater
を使用して、スイングコンポーネントを制御しています。
なぜ普通のスレッドではできないのでしょうか?裏側では一体何が起こっているのでしょうか?私が気づいたところでは、もし私が
JFrame
メインスレッドからvisibilityをtrueまたはfalseに設定してもエラーは出ませんし、動作しているようです。では
java.awt.EventQueue.invokeLater
? また、私は
SwingUtilities.invokeLater
しかし
ここで説明されている
というように、両者は同じものであるように思われます。
説明をしてくださった方、ありがとうございました。これが有効な質問であることを願っています。
EDIT: wumpzの質問に答えるために jframeを作成することができます
JFrame frame = new JFrame("Hello world");
frame.setSize(new Dimension(300, 300));
frame.setPreferredSize(new Dimension(300, 300));
frame.setMaximumSize(new Dimension(300, 300));
frame.setMinimumSize(new Dimension(300, 300));
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
そして、作成されたのと同じスレッドで、次のようにします。
for (int i = 0; i < 34; i++)
{
System.out.println("Main thread setting to "+(!frame.isVisible()));
frame.setVisible(!frame.isVisible());
}
そして、不満はない。
解決方法は?
というスレッドで、Swingの完全な処理が行われます。 EDT (イベントディスパッチスレッド) . そのため、このスレッドで長時間の計算を行うと、GUIがブロックされてしまいます。
ここでは、計算を別のスレッドで処理することで、GUIの応答性を維持する方法について説明します。最後にGUIを更新したいのですが、その場合
しなければならない
は、EDTの中で行われます。現在
EventQueue.invokeLater
が登場します。これはイベントを投稿します(あなたの
Runnable
) は、Swingsのイベントリストの最後にあり、それまでのGUIイベントがすべて処理された後に処理されます。
また
EventQueue.invokeAndWait
はここで可能です。違いは、GUIが更新されるまで、計算スレッドがブロックされることです。
ですから、これはEDTから使ってはいけないことは明らかです。
注意すること ではなく を使用して、別のスレッドからSwing GUIを更新してください。ほとんどの場合、更新やリフレッシュの際に奇妙な問題が発生します。
それでも、メインスレッドから単純なJFrameを開始するJavaコードが存在します。これは問題を引き起こす可能性がありますが、Swingから防止されているわけではありません。最近のIDEは、GUIを開始するためにこのようなものを作成します。
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
関連
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み】Android java.lang.IllegalStateException: Android java.lang.IllegalStateException: Could not execute method of the activity
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】宣言されたパッケージが期待されるパッケージと一致しない ""
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み] テスト
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み】koch snowflake java recursion
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?