問題タブ [invokelater]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
897 参照

java - Java Swing の EventQueue.invokeLater

このスレッドの本当の目的を理解しようとしています。私は本や記事を読みましたが、EventQueue スレッドが何を担当しているのかを明確に理解していませんでした。私は多くの例を見てきましたが、これが使用されることもあれば、使用されないこともあります。私が理解したように、このスレッドは、ウィンドウ、コンポーネントの作成、OS API からのネイティブ関数の呼び出しなど、すべての GUI 操作を担当しています。したがって、GUI の一部を変更するたびに、このアクションをキューに渡す必要があります。そのため、キュー アプリケーションを使用すると、デフォルトでメイン スレッドとイベント ディスパッチ スレッドの 2 つのスレッドがあります。したがって、すべてのビジネス ロジックはメイン スレッドで実行する必要があり (またはメイン スレッドから新しいスレッドを作成する)、すべての GUI 操作は EventQueue で実行する必要があります (たとえば、新しい項目をテーブルに追加したり、ラベル更新リストのテキストを変更したりします)。さらに、 EventQueue にメイン ウィンドウ (クラスは jframe を拡張) のインスタンスを作成する必要がありますか?

私は正しいですか?そうでない場合は、説明してください。よろしくお願いします。

0 投票する
1 に答える
1175 参照

java - javax.swing.SwingUtilities.invokeLater は必要ですか?

だから私は数え切れないほどの異なる GUI チュートリアルを見てきましたが、それらはすべてこのコードを使用すると述べています。

そして、これが正確に何をするのかよくわからないかもしれませんが、私はGUIに少し慣れていないので、それが何をするのかの基本を理解しています...またはそう思った. しかし、それから私は、実験として、それをすべて切り取って、ただ残しました:

そして、それはうまくいくように見えました。ここで質問があります。2 番目のコードが問題なく機能しているように見えたときに、2 番目のコードを使用するのではなく、最初のコードを保持する目的は何ですか? 必要な場合、使用しないとどうなりますか?

0 投票する
3 に答える
7053 参照

java - Java が別のスレッドから UI コンポーネントを更新する

私の質問について多くの回答が見つかりましたが、アプリケーションが例外をスローしない理由をまだ理解できません。NetBeans 8 で新しい Java フォーム アプリケーションを作成しました。フォームが作成され、main メソッドで次のように表示されます。

したがって、この新しい Runnable は新しい MainForm を作成し、それを可視に設定します。

次に、私のコードでは、いくつかの jButton と jTextField を更新する新しいスレッドを開始します。以下のコード:

そして、上記のように開始された他のスレッドがあり、上記のスレッドで更新されるさまざまな値を取得します。

私の質問は、私のコードが別のスレッドから更新された UI 要素に関して例外をスローしないのはなぜですか? 私は使用しませんでしたSwingUtilities.invokeLater(new Runnable() { //code here }); そして私のコードは完全に実行されます...

ありがとうございました!

0 投票する
2 に答える
551 参照

java - Javaで別のスレッドを作成する際のクエリ?

以下は、実際の問題コードのコンパイル済みプログラムのレプリカです。

if{}別のスレッドで main() のブロックを実行したい場所。この2行なので、

if(){}ブロックの完了を待つ必要はありません

もう 1 つの問題は、専門家がイベント スレッドで確認ダイアログ メソッドを実行することを推奨していることです。

私を助けてください!!!!

0 投票する
1 に答える
240 参照

java - invokeLater が期待どおりに機能しない (JButton が解放されない)

私は持っている:

  • JButton を含む JFrame。
  • アニメーションを表示する別の Canvas サブクラス。

そして、JButton を押すと、Canvas サブクラスをアニメーションとして表示する新しい JFrame を表示したいと考えています。

私が現在直面している問題は、新しい JFrame が表示されることですが、何もレンダリングする機会がなく、メイン フレームの JButton が押されたままです。この背後にあるロジックは、EDT が JButton をリリース済みとして表示するなどのジョブを完了していないため、アニメーション メソッドを実行する機会がなく、デッドロックに陥っているということです。

このロジックは、私が新しいスレッドを作成することでこの作業を行っていたため、以前はうまく機能していましたが、最近 Java、スレッド、および Swing について詳しく学んで、すべての Swing 関連のイベントを 1 つのスレッド (EDT) で処理する必要があることを知りました。 .

これは、以前にどのように機能させたかについて私を混乱させますが、invokeLaterを使用すると問題が解決すると信じています。JFrame を表示してアニメーションを表示するジョブはキューの最後に配置され、JButton の解放などを許可するためです。しかし、私は運がありませんでした。私は何かを完全に誤解していますか?

ありがとう!

(また、JPanel とは対照的に Canvas クラスの使用についてコメントしないでください。私には理由があります)。

サンプルコード:

Test5 (メイン メソッドを持つクラス)。

CanvasClass (キャンバス サブクラス)

0 投票する
1 に答える
442 参照

java - 最初の JFrame は「invokeLater」で作成する必要がありますか、それともメインから直接作成できますか?

私は最近、Java で Swing とグラフィックスを使用する方法を学び始め、GUI を設計するための 2 つの異なるアプローチに出会いました。

1) プログラムのメイン メソッドを JFrame クラスのインスタンスに含める。

2) main メソッドの最後に SwingUtilities.invokeLater() を呼び出して、main メソッドの初期化後までグラフィックスを処理するスレッドを遅らせるクラスを持つ。

例 1.

例 2.

アプローチ 2 のように、プログラム スレッドを安全にすることはどれほど重要ですか? また、各アプローチの長所と短所は何ですか? つまり、あるアプローチを他のアプローチよりも優先して使用するのはどのような場合ですか? 等

0 投票する
0 に答える
333 参照

java - Java SwingUtilities.invokeLater() 不正な式の開始エラー

私は異常な問題に遭遇しました。採点のためにコードを提出しましたが、教授が私の Java プログラムをコンパイル/実行すると、教授のコンピュータでは実行されないようです。Windows と Mac マシンの両方で試してみましたが、問題なく実行およびコンパイルされます。この問題は、古い JDK が原因であると推測しています。私のプロジェクトのコード全体 (ちょっと長い) が必要な場合は、それを提供できます。次のエラーが表示されます。

このエラーは構文によるものだと思いますが、複数の OS 上の複数の IDE でこれを実行すると、そのエラーは表示されません。彼女は私とまったく同じことを実行しています。

0 投票する
2 に答える
296 参照

java - イベント ディスパッチ スレッドを無視すると、このプログラムはどのように機能しますか?

今日、この質問に答えることができるかどうかを確認しようとしました。Event Dispatch Thread( EDT )を完全には理解していないことに気付きました。グーグルはそれを確認して助け、なぜ私がそうしないのかを明らかにしました。(これも理解に関係するかもしれません。)

コードは GUI を設定し、後で (前の質問のように) フラグが設定解除されるまでテキスト フィールドを更新します。

いくつか質問/要望があります。

  • swingInit両方の呼び出し (toとdoIt) がブロックの外側にある場合 (示されているように)、以下のコードが正常に実行される理由を説明してください。これはinvokeLater、両方の呼び出しが GUI に影響を与えたりクエリを実行したりしますが、どちらも EDT で実行されていないためです (そうですか?)。それは失敗を招いていませんか?

  • call toswingInitが inside とdoItoutside の場合もコードが実行されinvokeLaterます。これswingInitは EDT で実行されますが、EDT でdoIt実行することは問題ではありませんか? (これが機能したことに驚きました。そうすべきだったのでしょうか?)

  • どこにあるかに関係なく、doIt内部にある場合にハングする理由を理解していると思います: の目的は、GUIを初期化することだけです (右?)。invokeLaterswingInitinvokeLater

  • ブロック内ではなくdoIt、EDT でのみ (おそらく発生したイベントから) 開始する必要がありますか?invokeLater

(EDT の概念の歴史は興味深いものです。常にそうであるとは限りません。それを理解できない理由については、上記のリンクを参照してください。)