编辑:简化我的代码。
这是初始化 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");
}
每当incomingFileRequest
从 GUI 类(从任何 EventListener)中调用它时,它都能正常工作并且 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 元素。
任何帮助将不胜感激。