Chame
t.start() para iniciar um novo Thread , chamando Thread#run não faz nada além de chamar o run método do Thread dentro do mesmo contexto de thread... Dito isto, o Swing não é thread-safe, o Swing requer que todas as atualizações na interface do usuário sejam feitas dentro do contexto do Event Dispatching Thread. Em vez de usar um
Thread , você deve considerar usar um SwingWorker , que permite executar tarefas de longa duração em um thread em segundo plano, mas que fornece publish fácil de usar /process métodos e chamadas done quando ele for concluído, que são executados no contexto do EDT para você. Consulte Threads de trabalho e SwingWorker para mais detalhes