Pergunta

Tenho uma pergunta relacionada ao design para a qual estou tentando encontrar uma resposta.

Aqui está o cenário.

Suponha que você queira fazer algo caro (que consome tempo) como resultado da entrada do usuário (por exemplo,carregando grandes quantidades de dados de algum banco de dados, lendo arquivos grandes).A maneira fortemente recomendada é fazer o trabalho demorado em um thread separado e nunca bloquear o EDT, caso contrário a GUI deixará de responder.

No entanto, existem cenários em que você não deve fornecer entradas para a GUI, a menos que a tarefa em segundo plano seja concluída.No meu caso específico, somente após a conclusão do trabalho em segundo plano, posso determinar quais elementos da GUI devem estar visíveis e ativados/desativados.Somente os elementos da GUI que devem estar visíveis e habilitados devem responder às entradas do usuário, caso contrário, o comportamento pode ser imprevisível no meu caso específico.

Isso é o que estou fazendo para lidar com esse cenário.

Passo 1:Antes de iniciar uma operação demorada.

  1. Mude o cursor para um cursor ocupado.
  2. Adicione ouvintes de mouse ao painel de vidro do quadro de nível superior do componente.
  3. Torne o painel de vidro visível para que ele possa receber eventos do mouse.O painel de vidro não faz nada como resultado das entradas do mouse.

Passo 2:Execute a operação demorada em um thread em segundo plano.O thread de segundo plano possui um bloco final que notifica o thread de evento quando o trabalho é concluído (concluído ou abortado devido a um erro).

Etapa 3:

  1. Mude o cursor do mouse de volta ao normal.
  2. Remova os ouvintes do painel de vidro.
  3. Torne o painel de vidro invisível, para que os eventos do mouse cheguem aos destinatários pretendidos.

Esta é a abordagem correta para lidar com tais situações?

O que vocês recomendam?

Foi útil?

Solução

SwingWorker pode ser usado neste contexto.Os controles relacionados podem ser desativados quando a tarefa em segundo plano é iniciada e reativados em done().Neste relacionado exemplo, o run botão está condicionado para alternar entre "Executar" e "Cancelar".

Termo aditivo:Uma porta traseira para Java 1.5 está disponível aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top