Frage

In meiner Anwendung ich hole Daten, wenn die Komponente der Größe verändert wird. Ich mag den Abruf verzögern, bis Benutzervorgang abgeschlossen ändern. ComponentListener Ereignis componentResized feuert jedesmal, wenn die Fenstergröße verändert wird.

War es hilfreich?

Lösung

Ich würde sagen, Sie sind propably eine Mapping-Anwendung irgendeine Art zu schreiben? : -)

Sie können die Swing-Timer-Klasse verwenden, bis eine bestimmte Zeitspanne ohne Ereignisse übergeben zu warten. Hier ist der 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();
  }
}

Andere Tipps

Dies ist durch herkömmliche Mittel nicht möglich, ich habe Angst. componentResized() wird für jeden Zwischen Sizing Wechsel aufgerufen werden, und es gibt keine Möglichkeit, zu bestimmen, ob der aktuelle Anruf die letzten sein wird.

Genau genommen, was Sie versuchen, ist keine konventionelle Sache zu tun. Datenlasten können teuer IO-Operationen sein und werden in der Regel am besten durchgeführt, wenn der Benutzer sich nach einem direkteren UI Betrieb wie eine Taste drücken erwarten, wenn entsprechende Rückmeldung kann als Ergebnis ihrer Aktion angezeigt. Die Größe einer Komponente kann für unschuldige Gründe wie der Rahmen verändern anderswo als Folge einer Operation maximiert oder angeordnet ist, wie die neuen Aero-Operationen in Windows 7.

Einige Anwendungen tun ausführen IO als Ergebnis der Dimensionierung. Google Reader, zum Beispiel, kann ältere Beiträge lädt von RSS-Feeds als Ergebnis auf den Browser-Fenstern mit der Bildlaufleiste bewegen. Dies ist ein nettes Feature, und beseitigt die Notwendigkeit für einen expliziten Lastknopf weg, aber es wird direkt vom Benutzer versucht, die älteren Beiträge angetrieben; eine bewusste Handlung, kein Unbewussten.

Ich denke, mein Punkt ist, dass man sehr vorsichtig sein muß, wie Sie diese Arbeit machen. Punishing einen Benutzer mit einer langsamen IO Operation, die sie macht einfach warten, weil sie die Größe des Fensters gewagt ist kein benutzerfreundlichen Ansatz!

Sie geben wertvolle wenig Informationen in der Frage, was wie die Benutzeroberfläche aussieht, oder was die Komponente ist, oder wie es die Größe verändert wird - auch, wo Sie Daten aus geladen werden, so ist es irgendwie schwer zu beantworten. Hier sind ein paar Vorschläge: Ich hoffe, sie helfen

.

1. Laden Sie die Daten in den Speicher vorher, und sie nur an
Wenn das Datenmodell nicht zu groß ist, können Sie es einfach in den Speicher laden, und neu zu zeichnen sie schnell mit jedem Grßenänderungsereignis. Der Ereignis-Dispatch-Thread wird kombinieren Ereignisse zusammen die Größe, damit Ihre Zuhörer nicht durch Anfragen überwältigt. Dies könnte ein Rohrkrepierer für Sie sein, aber es ist erwähnenswert.

2. Seien Sie gespannt laden
Legen Sie mehr Daten, als Sie auf der ersten Grßenänderungsereignis benötigen, und dann entweder ablehnen oder die Daten zwischenspeichern Sie nicht verwenden. Wenn Sie die Zeilen einer Tabelle oder einer Liste sind bevölkern könnte dies die bessere Lösung sein; tabellarische Daten sind in der Regel geradlinig zu laden und zu analysieren.

3. Lassen Sie eine angemessene Zeit für passieren Ändern der Größe
zu stoppen Das erste Resize-Ereignis startet einen Timer mit einem 1-Sekunden-Countdown. Nachträgliche Resize Ereignisse zurückgesetzt den 1-Sekunden-Countdown. An einem gewissen Punkt wird es eine endgültige Grßenänderungsereignis sein, nach der keine nachfolgenden Resize Ereignisse um den Countdown zurückgesetzt, so es erlaubt ist, abläuft. An diesem Punkt der Timer ist Ihre Belastung für Sie.

Drei ist der sicherste, genaueste Ansatz, meiner Meinung nach. Sie können Ihre Anwendung fühlen reagiert, indem sichtbar anzeigt, dass Daten geladen werden auf der ersten Grßenänderungsereignis, und stellen Sie den Countdown des Timers zu bekommen das Gefühl der Anwendung richtig machen.

Dies ist nicht möglich. Aber man kann benutzen SingleWorkerThread die Anzahl der Ereignisse verarbeitet minimalisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top