私の質問はSwingUtilities.invokeLater
に関連しています。それはいつ使うべきですか? GUIコンポーネントを更新する必要があるたびに使用する必要がありますか?それは何を正確にしていますか?それは直感的に聞こえず、一見不必要なコードを追加するので、それに代わるものはありますか?SwingUtilities.invokeLater
答えて
GUIコンポーネントを更新する必要があるたびに使用する必要がありますか?
いいえ、あなたは、このようなクリックや選択などのユーザーが開始したイベントに応答するときに、常にそうであるイベントディスパッチスレッド(EDT)に、すでにしている場合。 (actionPerformed
方法などは、必ずEDTによって呼び出されます。)
あなたはしかし、EDT上ないだとGUIの更新(あなたには、いくつかのタイマースレッドからGUIを更新する場合、またはからをしたい場合いくつかのネットワークスレッドなど)、スケジュール EDTによって実行される更新が必要です。これがこの方法です。
スイングは基本的にスレッドが安全ではありません。つまり、そのAPIとのすべてのやりとりは、1つのスレッド(EDT)で実行する必要があります。別のスレッド(タイマースレッド、ネットワーキングスレッドなど)からGUI更新を行う必要がある場合は、上記のようなメソッド(SwingUtilities.invokeLater、SwingUtilities.invokeAndWait、...)を使用する必要があります。
すべてのSwingアプリケーションは、少なくとも2件のスレッドがあります。アプリケーション
- を)。
UIを更新する場合は、EDT内でコードを実行する必要があります。 SwingUtilities.invokeLater、SwingUtilities.invokeAndWait、EventQueue.invokeLater、EventQueue.invokeAndWaitのようなメソッドを使用すると、EDTによってコードを実行できます。
シンプルでわかりやすい、ありがとうございます – Yahya
ほとんどのユーザー開始イベント(クリック、キーボード)は既にEDT上にあるため、SwingUtilitiesを使用する必要はありません。これは、EDTを更新するmain()スレッドとワーカースレッドを除いて、多くのケースをカバーしています。
私の質問は今回は
SwingUtilities.invokeLater
に関連しています:いつ使用しますか?
Javaには、Swing関連のイベントを処理する別のスレッド(EDT)があります。
invokeLater()
を使用して、デスクトップアプリケーションのメインJFrame
を現在のスレッドで実行するのではなく、表示する必要があります。後でアプリケーションを正常に閉じるためのコンテキストも作成されます。
これはほとんどのアプリケーションで使用できます。
GUIコンポーネントを更新する必要があるたびに使用する必要がありますか?それは何を正確にしていますか?
GUIコンポーネントを変更すると、後でSwingによってディスパッチするために登録されたイベントがトリガーされます。このイベントのリスナーがある場合、EDTスレッドは道路のどこかでそれを呼び出します。 invokeLater()
を使用する必要はありません。コンポーネント上のリスナーを適切に設定するだけです。
このスレッドは画面上にフレームなどを描くのと同じスレッドであることに注意してください。したがって、リスナーは複雑な/長い/ CPUの集中的なタスクを実行してはいけません。そうしないと、画面がフリーズします。
直感的に聞こえないようで、一見不必要なコードが追加されているので、代替手段はありますか?
アプリケーションをinvokeLater()
+コンポーネントで興味のあるリスナーで表示するよりもコードを書く必要はありません。残りはSwingによって処理されます。
Swing is single threaded and all changes to the GUI must be done on EDT
invokeLater()
主な方法は、常に
EventQueue
の終わりにinvokeLater()
- 遅延
(ただし、非同期)アクション/イベントに包まれるべきために基本的な使い方、
EDTが存在しない場合は、を使用して新しいEDTを作成する必要があります10。あなたは
if (SwingUtilities.isEventDispatchThread()) {...
は
invokeAndWait()
が存在すると、それをテストすることができますが、今日までの私(ちょうど私の見解では)代わりにinvokeLater()
のinvokeAndWait()
を使用する理由を見つけることができません、GUI(JTreeの&のJTable)にハードの変更を除いて、ちょうどSubstance L&F(EDT上のイベントのテストの一貫性のための優れた)で基本的なもの:Concurrency in Swing
バックグラウンドタスクからのすべての出力は
に包まれなければなりませんinvokeLater()
- 1. Java SwingUtilities.invokeLater
- 2. EventQueue.invokeLater vrs SwingUtilities.invokeLater
- 3. WPFのSwingUtilities.invokeLater相当の
- 4. SwingUtilities.invokeLater、SwingWorker、gif icon animation issue
- 5. 同様の機能SwingUtilities.invokeLater in android?
- 6. 無限ループのSwingUtilities.invokeLaterは継続しませんか?
- 7. スレッドはSwingUtilities.invokeLaterからメインスレッドに戻っていません
- 8. ダイナミックJTreeのとSwingUtilities.invokeLaterを()私のダイナミックJTreeのを作成するには、何も
- 9. SwingUtilities.invokeLaterを使用してもGUIが停止するのはなぜですか?
- 10. ラムダ関数をQtのイベントループに入れる方法は? <pre><code>SwingUtilities.invokeLater(()->{/* function */}); </code></pre> <p>またはこのような</p> JavaScriptで:</p> <pre><code>setTimeout(()=>{/* function */}, 0); </code></pre> <p>しかし、Qtとラムダとの
- 11. invokeLaterを使用してダイアログを1つずつ表示する
- 12. ポーリングが、私はJavaを使用して、チャットサービスやデスクトップクライアントを実装している
- 13. Whileループと遅延によるSwing GUIの更新
- 14. オブジェクトを実装に渡してローカルオブジェクトを渡すにはどうすればよいですか?
- 15. invokeLaterがメインスレッドで実行されるのはなぜですか?
- 16. JTextFieldとJButtonのログインページ
- 17. シンプルなJavaFXのブラウザは初回のみ、その私は、カスタムJavaブラウザを開くには、このコードを持って
- 18. JProgressBarのsetStringを複数回
- 19. Javaの$記号とは何ですか?私はヴァル・$のたEditorKitまたは手段下に$記号が、運が何であるかを把握しようとしてどこでも検索した
- 20. ここでは、スクリプトのWebViewのJavaFX
- 21. Amharic文字を読み取るためのSwing GUIエンコーディング
- 22. swing utilities.invokelater関数は何をしますか?
- 23. 私は次のようにEDTをダブルクリックしてマウスイベントを生成しようとしていたJava Swingの
- 24. スイングイベントスレッドのJava
- 25. JavaでJProgressBarをリセットするにはどうすればよいですか?
- 26. TCPとUDPサーバーの両方を開始するには?どこから始めるのか
- 27. JScrollPaneのコンポーネントがKeyEventsの受信を停止します
- 28. 例外ブロックの取得ScheduledExecutorService
- 29. EDTが "system"グループに変更され、Thread.currentThread()。getContextClassLoader()がnullです
- 30. ストリーミング更新を伴うJavaスイングツリー
これは、 'Control.BeginInvoke'と同じです。 – SLaks
@SLaksそれは、私はそれを使用する必要はありません1つのスレッドを持っていることを意味ですか? – FadelMS
@FadelMS Swingフレームワークは独自のスレッド(EDT)を生成するので、常にそのスレッドがあります。 (あなたはユーザーのクリックなどを処理する "メッセージチェック"ループを持っていません、そうでしょう、様々な 'actionPerformed'メソッドはどのように呼び出されますか?EDTによって!)あなたは* *スレッド、私はあなたが* EDTを持っている(つまり、GUIを投げてメインメソッドの端から落ちた)ように私はintepretする必要があります。その場合、いいえ、* invokeLaterを使う必要はありません。しかし、あなたは "バックグラウンド"処理を行うことはできません。そうすれば、GUIは完全にロックされます... – aioobe