Question

Dans ma demande, je récupérer les données si le composant est redimensionné. Je veux retarder le chercher jusqu'à ce que l'utilisateur effectue l'opération de redimensionnement. événement ComponentListener componentResized se déclenche à chaque fois que la fenêtre est redimensionnée.

Était-ce utile?

La solution

Je dirais que vous écrivez propably une application de cartographie d'une sorte? : -)

Vous pouvez utiliser la balançoire classe Timer d'attendre jusqu'à ce qu'une quantité de temps passé sans aucun événement. Voici le code:

/** 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();
  }
}

Autres conseils

Ceci est impossible par des moyens conventionnels, j'ai peur. componentResized() sera appelé à chaque changement de taille intermédiaire, et il n'y a aucun moyen de déterminer si l'appel en cours sera le dernier.

Strictement parlant, ce que vous essayez est pas une chose conventionnelle à faire. charges de données peuvent être coûteuses opérations IO et sont généralement mieux réalisées lorsque l'utilisateur les attend après une opération de l'interface utilisateur plus directe, comme une presse de bouton, lorsque le retour approprié peut être affiché à la suite de leur action. La taille d'un composant peut changer pour des raisons innocentes telles que le cadre étant maximisée ou disposé à la suite d'une opération ailleurs, comme les nouvelles opérations aéro à Windows 7.

Certaines applications faire effectuer IO à la suite de dimensionnement. Google Reader, par exemple, peut charger des messages plus anciens de flux RSS en raison de déplacer la barre de défilement dans la fenêtre du navigateur. Ceci est une fonctionnalité intéressante, et supprime la nécessité d'un bouton de charge explicite, mais il est entraîné directement par l'utilisateur recherche les messages plus anciens; une action consciente, pas inconscient.

Je suppose que mon point est que vous devez être très prudent sur la façon dont vous faites ce travail. Punir un utilisateur avec une opération IO lente qui les fait attendre tout simplement parce qu'ils osaient redimensionner la fenêtre est pas une approche conviviale!

Vous donnez peu d'informations précieuses dans votre question sur ce que votre interface utilisateur ressemble ou ce que le composant est ou comment il se redimensionnée - même, où vous chargez des données à partir, donc il est un peu difficile de répondre. Voici quelques suggestions: J'espère qu'ils aident

.

1. Chargez les données en mémoire au préalable, et afficher simplement Si le modèle de données ne sont pas trop grand, vous pouvez le charger dans la mémoire, et redessiner rapidement chaque événement resize. L'événement-Dispatch-fil combinera les événements de redimensionnement ensemble pour votre auditeur ne soit pas submergé par les demandes. Cela pourrait être un pour vous non-starter, mais il convient de mentionner.

2. Désireux de charger Chargez plus de données que vous avez besoin sur le premier événement resize, puis rejeter ou mettre en cache les données que vous n'utilisez pas. Si vous peuplant les lignes d'une table ou d'une liste cela pourrait être la meilleure approche; Les données de tableau est généralement simple pour charger et analyser.

3. Laisser un délai raisonnable de passer pour le redimensionnement d'arrêter Le premier événement resize démarre une minuterie avec 1 seconde compte à rebours. Tous les événements de redimensionnement suite remis à zéro le compte à rebours 1 seconde. À un certain moment, il y aura un événement resize finale après quoi aucun événement Redimensionner le compte à rebours suite remis à zéro il est autorisé à expirer. A ce stade, la minuterie que votre charge pour vous.

Trois est le plus sûr, l'approche la plus précise, à mon avis. Vous pouvez faire votre demande en indiquant se sentir sensibles visiblement que le chargement des données sur le premier événement resize et régler le compte à rebours de la minuterie pour obtenir la sensation de votre droit d'application.

Ceci est impossible. Mais vous pouvez utiliser SingleWorkerThread minimaliser le nombre d'événements traités.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top