Проблема в том, что вам нужно выполнять вычисления асинхронно. Вы должны создать фоновый поток, который выполняет вычисления, а затем использовать SwingUtilities.invokeLater для обновления JTextArea.
final ArrayList<String> myLinks = //...
(new Thread()
{
public void run(){
for (String s : myLinks) {
try{
final String result = LinkChecker.checkFileStatus(s) + "\n";
SwingUtilities.invokeLater(new Runnable(){
public void run(){
jtextArea2.append(result);
}
});
}catch(IOException error){
// handle error
}
}
}
}).start();
Редактировать
Было отмечено, что функция добавления JTextArea на самом деле является поточно-ориентированной (в отличие от большинства функций Swing). Следовательно, для этого конкретного случая нет необходимости обновлять его через invokeLater. Тем не менее, вы все равно должны выполнять обработку в фоновом потоке, чтобы позволить обновлению GUI, поэтому код:
final ArrayList<String> myLinks = //...
(new Thread()
{
public void run(){
for (String s : myLinks) {
try{
jtextArea2.append(LinkChecker.checkFileStatus(s) + "\n");
}catch(IOException error){
// handle error
}
}
}
}).start();
Однако для почти любой другой операции, которая модифицирует объект Swing, вам нужно будет использовать invokeLater (чтобы гарантировать, что изменение происходит в потоке GUI), поскольку почти все функции Swing не являются поточно-ориентированными.