問題タブ [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.
java - ボタンのクリック後にinvokelaterが実行されない
私はinvokeLaterを使用していますが、希望どおりに機能していません。
ボタンのクリック後に jLabel を更新したいのですが、jLabel に出力されません。
私のプログラムは完全なコンピューター名を見つけて、同じインスタンス内で jLabel を更新することになっていますが、まったく更新されておらず、その理由がわかりません。
クラス全体をここに貼り付けたくはありませんでしたが、見たい場合は、ここにあります: http://pastebin.com/BsU9zST4助けていただければ幸いです。
ラベルはtestLabelと呼ばれます
java - invokeLater と NetBeans のメイン クラス
NetBeans を使用して新しい JFrame プロジェクトを作成するときに、自動生成されたコードを調べていたところ、私のmainメソッドで次のことがわかりました。
いくつか読んだ後、GUI コンポーネントが EDT で処理されるように、invokeLater の必要性を理解するようになりました。そうは言っても、new TestClass().setVisible(true);ここで実装されている行は、私には少し気が遠くなります。新しいインスタンスを作成するコンテキストで取得します...
run()...しかし、上記の方法で何が起こっているのかよくわかりません。そのコードは匿名クラスを作成していますか? 私はその用語に出くわしましたが、まだ完全には理解していません。そのインスタンスを参照するための変数(とにかく見ることができる)がないため、上にリストした「教科書」の方法でインスタンスを作成していないと思います。
余談ですが、mainメソッドをJFrameクラス(またはGUIクラス)内に配置するのは理想的ではないように思われるので、おそらく移動します。
java - 別のスレッドで GUI メソッドを呼び出した後、GUI が更新されない
編集:私のコードを簡素化しました。
これは、GUI およびサーバー スレッドを初期化するメイン クラスです。
現在、私のpublic class TransceiverGUI extends javax.swing.JFrame implements Runnableクラスには、次のメソッドがあります。
GUI クラス内から (任意の EventListener から) 呼び出されるたびincomingFileRequestに、完全に機能し、GUI が更新されます。
incomingFileRequestただし、クラス/スレッドから呼び出すとServer、コードが実行されて正しい値が返されますが、GUI は更新されません。
サーバー スレッドは次のように呼び出します。
// POPUP with request
boolean answer = gui.incomingFileRequest(message.getMessage(), message.getFileSize(), message.senderIPAddress);
GUI を更新するコードを、次のような新しいスレッドを作成するブロックに配置しました。
私も試しjavax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { /* update GUI code */ }
});ました。
私の質問は、別のスレッドから GUI クラス内のメソッド (GUI を更新する) を呼び出すにはどうすればよいですか? コードが完全に実行されることに注意してください。GUI 要素は更新されません。
どんな助けでも大歓迎です。
java - 操作が完了するまでJFrameがスタックするのはなぜですか?
「中止」で作成しましたJFrame。JButton
これJFrameは、操作のステータスを示します。
operation()関数に実行したい操作のコードが含まれているとしましょう。
関数のコードが実行されている間、 「中止」operation()をクリックできません。JButtonJFrame
そのため、原因はイベントディスパッチャーである可能性があると考えたため、invokeLaterofを使用して問題を修正しようとしましたSwingUtilities:
ただし、JFrame操作のコードが実行されている間は、まだスタックしています。どうすればこれを修正できますか?
java - invokelater で JFileChooser を 2 回呼び出すと、プログラムが終了しない
2 つのテキスト ファイルから情報を収集してデータベースのテーブルに追加するプログラムを作成しています。ユーザーが自分のファイルを選択できるようにするために、クラスをchooseFile()使用してa を表示するという非静的メソッドを作成しました(静的メソッドとしても試してみましたが、同じ結果が得られました。推測しているように聞こえる場合は、あなたは正しいです-私はプログラミングについてはまあまあです)。JFileChoosershowOpenDialog
私の理解では、Swing クラスへの呼び出しは をmain()使用して行う必要がありますinvokelater。これは、 への 1 回の呼び出しではすべて正常に機能しました (JVM は正常に終了しました)chooseFile()が、2 回目の呼び出しを JVM に追加するとchooseFile()、JVM は無期限に実行され続けます。chooseFile()ただし、を使用せずに実行すると、プログラムは両方の呼び出しで正常に終了しますinvokelater。System.exit(0)2 番目の呼び出しの後に追加するとinvokelater、プログラムを正常に終了させることもできます。
私が収集できたものから、プログラムはすべての (非デーモン) スレッドが閉じられるまで終了しません。invokelaterただし、スレッドセーフでない Swing 関連のすべてのアクティビティを EDT にプッシュすることが使用の目的であると考えました。ここでベストプラクティスを使用しSystem.exit(0)ていますか、それとも他に知っておくべきことがありますか?
これが私のSSCCEです: