Как говорилось в сообщении, важно не блокировать EDT (поток отправки событий).В моем примере ниже фактическая работа начинается с потока EDT, как это происходит при нажатии кнопки ActionListener.Мне нужно обернуть его отдельным потоком, чтобы он был отделен от потока отправки событий.Таким образом, EDT не блокируется.
Также обратите внимание, что вам необходимо использовать SwingUtilities.invokeLater () при обновлении пользовательского интерфейса из отдельного потока.Пример кода ниже немного упрощен от моего исходного кода.Я на самом деле выполняю несколько задач параллельно, используя несколько потоков, и в каждом из этих потоков вызывается updateProgress () для обновления TextArea путем добавления последнего статуса.
Полный исходный код здесь: https://github.com/mhisoft/rdpro/blob/master/src/main/java/org/mhisoft/rdpro/ui/ReproMainForm.java
btnOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//Don't block the EDT, wrap it in a seperate thread
DoItJobThread t = new DoItJobThread();
t.start();
}
});
class DoItJobThread extends Thread {
@Override
public void run() {
//do some task
// output the progress
updateProgress();
}
}
public void updateProgress(final String msg) {
//invokeLater()
//This method allows us to post a "job" to Swing, which it will then run
// on the event dispatch thread at its next convenience.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Here, we can safely update the GUI
// because we'll be called from the
// event dispatch thread
outputTextArea.append(msg);
outputTextArea.setCaretPosition(outputTextArea.getDocument().getLength());
//labelStatus.setText(msg);
}
});
}