Pergunta

Na minha aplicação eu buscar dados se o componente é redimensionada. Eu quero atrasar a busca até que usuário conclui operação de redimensionamento. evento ComponentListener componentResized dispara cada vez que a janela é redimensionada.

Foi útil?

Solução

Eu diria que você está propably escrevendo um aplicativo de mapeamento de algum tipo? : -)

Você pode usar a classe Timer balanço que esperar até uma determinada quantidade de tempo passado sem quaisquer eventos. Aqui está o código:

/** Time to wait */
private final int DELAY = 1000;
/** Waiting timer */
private javax.swing.Timer waitingTimer;

/**
 * Handle resize event.
 */
public void componentResized(ComponentEvent e) 
{
  if (this.waitingTimer==null)
  {
    /* Start waiting for DELAY to elapse. */
    this.waitingTimer = new Timer(DELAY,this);
    this.waitingTimer.start();
  }
  else
  {
    /* Event came too soon, swallow it by resetting the timer.. */
    this.waitingTimer.restart();
  }
}

/** 
 * Actual resize method
 */
public void applyResize()
{
  //...
}

/**
 * Handle waitingTimer event 
 */
public void actionPerformed(ActionEvent ae)
{
  /* Timer finished? */
  if (ae.getSource()==this.waitingTimer)
  {
    /* Stop timer */
    this.waitingTimer.stop();
    this.waitingTimer = null;
    /* Resize */
    this.applyResize();
  }
}

Outras dicas

Isto não é possível através de meios convencionais, estou com medo. componentResized() será chamado para cada mudança de dimensionamento intermediário, e não há maneira de determinar se a chamada atual será a última.

A rigor, o que você está tentando não é uma coisa convencional para fazer. cargas de dados pode ser operações de IO caros e são geralmente melhor executada quando o usuário está esperando por eles após uma operação de interface mais direta, como pressionar um botão, quando o feedback apropriado pode ser exibida como resultado de sua ação. O tamanho de um componente pode mudar por razões inocentes, como o quadro que está sendo maximizada ou organizados como resultado de uma operação em outro lugar, como as novas operações Aero em Windows 7.

Algumas aplicações fazer executar IO como resultado de dimensionamento. Google Reader, por exemplo, pode carregar mensagens mais antigas de feeds RSS como resultado de mover a barra de rolagem na janela do browser. Este é um bom recurso, e acaba com a necessidade de um botão de carga explícita, mas é conduzido diretamente pelo usuário buscando os posts mais antigos; uma ação consciente, não um inconsciente.

Eu acho que meu ponto é que você precisa ser muito cuidadosos sobre como fazer este trabalho. Punir um usuário com uma operação IO lento que os faz esperar simplesmente porque ousou redimensionar a janela não é uma abordagem user-friendly!

Você dá pouca informação preciosa na sua pergunta sobre o que a sua aparência da interface do usuário gosta, ou o que o componente é ou como ele fica redimensionada - mesmo, onde você está carregamento de dados de, por isso é tipo de difícil resposta. Aqui estão algumas sugestões:. Espero que ajuda

1. Carregar os dados na memória de antemão, e apenas exibi-lo
Se o modelo de dados não é muito grande você poderia apenas carregá-lo na memória, e redesenhá-lo rapidamente com cada evento de redimensionamento. O evento-Dispatch-Thread irá combinar eventos de redimensionamento em conjunto para que o ouvinte não está sobrecarregado por pedidos. Isso pode ser um non-starter para você, mas vale a pena mencionar.

2. Estar ansioso para carregar
Carregar mais dados do que você precisa sobre o primeiro evento de redimensionamento, e depois rejeitar ou armazenar em cache os dados que você não usa. Se você está preenchendo as linhas de uma tabela ou uma lista esta pode ser a melhor abordagem; dados tabulares é geralmente simples e direta para carregar e analisar.

3. Conceder um prazo razoável para passar para redimensionar a parada
O primeiro evento de redimensionamento inicia um temporizador com uma segunda contagem regressiva 1. Todos os eventos de redimensionamento subseqüentes redefinir a um segundo contagem regressiva. Em algum momento, haverá um evento de redimensionamento limite após a qual nenhum evento de redimensionamento subseqüentes repor a contagem regressiva por isso é a caducar. Neste ponto, o temporizador faz a sua carga para você.

Três é a abordagem mais segura, mais precisa, na minha opinião. Você pode fazer a sua inscrição sentir responsivo, indicando visivelmente que os dados são de carregamento no primeiro evento de redimensionamento e ajustar a contagem regressiva do temporizador para obter a sensação do seu direito de aplicação.

Isto não é possível. Mas você pode usar SingleWorkerThread minimalize o número de eventos processados.

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