EDIT: Упрощен мой код.GUI не обновляется после вызова метода 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) она прекрасно работает и графический интерфейс обновлено.
Однако, когда я вызываю incomingFileRequest
из класса/потока Server
, код запускается и возвращает правильное значение, но графический интерфейс пользователя не обновляется.
Сервер нить называет это так: // POPUP with request boolean answer = gui.incomingFileRequest(message.getMessage(), message.getFileSize(), message.senderIPAddress);
Я поставил код, который обновляет графический интерфейс в блоке, который создает новую нить вроде этого:
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 просто не обновляются.
Любая помощь была бы принята с благодарностью.
** Swing одиночный с резьбой **. Вы просто не можете использовать элементы Swing из нескольких потоков. Это не разрешено**. Вы ** должны ** ограничивать доступ к компонентам Swing к EDT. –
I второй @ комментарии BoristheSpider выше. Кроме того, ваша проблема представляет собой несколько сложную проблему для связи между различными классами с использованием разных потоков, и для этого может потребоваться создание и публикация [mcve], чтобы мы могли полностью понять вашу проблему и ее возможные причины. Пожалуйста, прочитайте ссылку. –
Что касается вашего редактирования выше, если это связано с моим комментарием выше, то я не думаю, что вы понимаете, о чем я прошу. Опять же, пожалуйста, прочитайте ссылку, поскольку она полностью объяснена там. –