java thread.sleep coloca o swing ui para dormir também

Eu estou criando um aplicativo de teste simples que executa uma verificação a cada hora no diretório / s selecionado usando thread.sleep () através do JFileChooser. Mas quando eu seleciono o diretório e o método executa, o painel ui fica cinza e os bits de balanço desaparecem. O thread parece estar colocando o ui para dormir, bem como o método de sua chamada.

if (option == JFileChooser.APPROVE_OPTION) { selectedDirectory = chooser.getSelectedFiles(); try { while (true) { runCheck(selectedDirectory); Thread.sleep(1000*5);//1000 is 1 second } } catch (InterruptedException e1) { Thread.currentThread().interrupt(); e1.printStackTrace(); } } 

Eu estou procurando uma maneira de contornar esse problema para que eu possa imprimir os resultados das verificações a serem executadas no ui .setText (resultado)

Você está correto sobre o código colocando a interface do usuário em suspensão. Como o modo de sleep é chamado no encadeamento de expedição de events (o encadeamento responsável pela execução da GUI), a interface do usuário para o processamento de events e “adormece”.

Eu acho que o que você quer é um javax.swing.Timer .

 Timer t = new Timer(1000 * 5, new ActionListener() { public void actionPerformed(ActionEvent e) { // do your reoccuring task } }); 

Isso fará com que sua tarefa recorrente seja executada fora do EDT e, portanto, não deixará seu ui sem resposta.

Se o código que você postou for executado no EventDispatchThread, então não há como o Swing poder redesenhar a GUI. Você está bloqueando (dormindo) o segmento que deveria lidar com isso!

Isso ocorre porque você está executando o check-in do thread principal da GUI e está usando um loop infinito. Essa verificação é uma tarefa em segundo plano e deve ser executada em seu próprio encadeamento para que a GUI ainda possa receber e reagir à input pelo usuário.

Você também não precisa escrever sua própria implementação, Java tem um object Timer .

Edit: Há também um object timer específico Swing. Isso fará com que a ação ocorra no encadeamento da GUI, portanto, se sua tarefa for longa, ela poderá travar a GUI enquanto a ação está ocorrendo (mas não enquanto está aguardando).