編集:私のコードを簡素化しました。
これは、GUI およびサーバー スレッドを初期化するメイン クラスです。
public class Main {
public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, UnknownHostException {
Runnable tGUI = new TransceiverGUI();
Runnable server = new Server(tGUI);
new Thread(tGUI).start();
new Thread(server).start();
}
}
現在、私のpublic class TransceiverGUI extends javax.swing.JFrame implements Runnable
クラスには、次のメソッドがあります。
protected boolean incomingFileRequest(String filename, long filesize, String user) throws InterruptedException, InvocationTargetException {
/* .... code logic which executes .... */
/* UPDATE GUI HERE DOES NOT WORK */
LabelProgress.setForeground(Color.red);
LabelProgress.setText("Receive Progress");
}
GUI クラス内から (任意の EventListener から) 呼び出されるたびincomingFileRequest
に、完全に機能し、GUI が更新されます。
incomingFileRequest
ただし、クラス/スレッドから呼び出すとServer
、コードが実行されて正しい値が返されますが、GUI は更新されません。
サーバー スレッドは次のように呼び出します。
// POPUP with request
boolean answer = gui.incomingFileRequest(message.getMessage(), message.getFileSize(), message.senderIPAddress);
GUI を更新するコードを、次のような新しいスレッドを作成するブロックに配置しました。
Thread t = new Thread() {
public void run() {
LabelProgress.setForeground(Color.red);
LabelProgress.setText("Receive Progress");
repaint();
}
};
t.start();
私も試しjavax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { /* update GUI code */ }
});
ました。
私の質問は、別のスレッドから GUI クラス内のメソッド (GUI を更新する) を呼び出すにはどうすればよいですか? コードが完全に実行されることに注意してください。GUI 要素は更新されません。
どんな助けでも大歓迎です。