Swing в основном однопоточный, вызов методов из нескольких потоков может вызвать проблемы. Вы должны изменить свою метку в специальном потоке, называемом потоком отправки событий (EDT).
ActionListener.actionPerformed
работает в этом потоке, поэтому вместо
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
loadState.setText("Loading document "+name+" . Please wait!");
}
}).start();
Вы можете написать:
loadState.setText("Loading document "+name+" . Please wait!");
Кажется, что ваша загрузка также выполняется на EDT:
if (name.toLowerCase().equals("daffodils.txt")) {
try {
loadText(tpPoem);
} catch (IOException e1) {
e1.printStackTrace();
}
}
Если вы используете фоновый поток в этом методе, тогда все в порядке, в противном случае проверьте SwingWorker, Это для выполнения длинных задач в фоновом потоке. Если вы блокируете EDT с помощью долго выполняющейся задачи, метка не будет обновляться до тех пор, пока задача не будет завершена.
Если вы хотите обновить GUI из фонового потока, SwingWorker
имеет методы для этого. Кроме того, вам может быть интересен этот вопрос: Когда и где вызывать метод EventQueue.invokeLater ()