問題タブ [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()
をクリックできません。JButton
JFrame
そのため、原因はイベントディスパッチャーである可能性があると考えたため、invokeLater
ofを使用して問題を修正しようとしましたSwingUtilities
:
ただし、JFrame
操作のコードが実行されている間は、まだスタックしています。どうすればこれを修正できますか?
java - invokelater で JFileChooser を 2 回呼び出すと、プログラムが終了しない
2 つのテキスト ファイルから情報を収集してデータベースのテーブルに追加するプログラムを作成しています。ユーザーが自分のファイルを選択できるようにするために、クラスをchooseFile()
使用してa を表示するという非静的メソッドを作成しました(静的メソッドとしても試してみましたが、同じ結果が得られました。推測しているように聞こえる場合は、あなたは正しいです-私はプログラミングについてはまあまあです)。JFileChooser
showOpenDialog
私の理解では、Swing クラスへの呼び出しは をmain()
使用して行う必要がありますinvokelater
。これは、 への 1 回の呼び出しではすべて正常に機能しました (JVM は正常に終了しました)chooseFile()
が、2 回目の呼び出しを JVM に追加するとchooseFile()
、JVM は無期限に実行され続けます。chooseFile()
ただし、を使用せずに実行すると、プログラムは両方の呼び出しで正常に終了しますinvokelater
。System.exit(0)
2 番目の呼び出しの後に追加するとinvokelater
、プログラムを正常に終了させることもできます。
私が収集できたものから、プログラムはすべての (非デーモン) スレッドが閉じられるまで終了しません。invokelater
ただし、スレッドセーフでない Swing 関連のすべてのアクティビティを EDT にプッシュすることが使用の目的であると考えました。ここでベストプラクティスを使用しSystem.exit(0)
ていますか、それとも他に知っておくべきことがありますか?
これが私のSSCCEです: