2009-08-15 17 views

Antwort

1

Ich würde sagen, dass Sie wahrscheinlich eine Mapping-Anwendung irgendeiner Art schreiben? :-)

Sie können die Swing-Timer-Klasse verwenden, um zu warten, bis eine angegebene Zeitspanne ohne Ereignisse verstrichen ist. 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(); 
    } 
} 
+0

Vielen Dank für Ihre Zeit, um detaillierte Beispiel zu schreiben; Diese Lösung scheint meiner Anforderung zu entsprechen. –

0

Dies ist nicht möglich. Sie können jedoch SingleWorkerThread verwenden, um die Anzahl der verarbeiteten Ereignisse zu minimieren.

1

Dies ist mit konventionellen Mitteln nicht möglich, fürchte ich. componentResized() wird für jede Zwischengrößenänderung aufgerufen, und es gibt keine Möglichkeit festzustellen, ob der aktuelle Aufruf der letzte sein wird.

Streng genommen ist das, was Sie versuchen, nicht eine herkömmliche Sache zu tun. Datenladungen können teure E/A-Vorgänge sein und werden normalerweise am besten ausgeführt, wenn der Benutzer sie nach einer direkteren UI-Operation erwartet, z. B. beim Drücken einer Taste, wenn aufgrund ihrer Aktion entsprechende Rückmeldungen angezeigt werden können. Die Größe einer Komponente kann sich aus unschuldigen Gründen ändern, z. B. weil der Frame als Ergebnis einer Operation an anderer Stelle maximiert oder angeordnet wird, z. B. die neuen Aero-Operationen in Windows 7. Einige Anwendungen do führen daher IO durch Größe. Google Reader kann beispielsweise ältere Posts aus RSS-Feeds laden, wenn die Bildlaufleiste im Browserfenster verschoben wird. Dies ist eine nette Funktion und macht die explizite Lade-Schaltfläche überflüssig, aber sie wird direkt von dem Benutzer gesteuert, der die älteren Posts sucht. eine bewusste Handlung, keine unbewusste.

Ich denke, mein Punkt ist, dass Sie sehr vorsichtig sein müssen, wie Sie diese Arbeit machen. Wenn ein Benutzer mit einer langsamen E/A-Operation bestraft wird, die ihn warten lässt, weil er es gewagt hat, die Größe des Fensters zu ändern, ist dies kein benutzerfreundlicher Ansatz!

Sie geben in Ihrer Frage wertvolle Informationen darüber, wie Ihre UI aussieht oder wie die Komponente aussieht oder wie sie in der Größe geändert wird - selbst wo Daten geladen werden. Daher ist es schwer zu beantworten. Hier sind ein paar Vorschläge: Ich hoffe, sie helfen.

1. Legen Sie die Daten in den Speicher vorher, und zeigt es nur
Wenn das Datenmodell nicht zu groß ist, können Sie es einfach in den Speicher laden, und neu zu zeichnen sie schnell mit jedem Ereignis ändern. Der Event-Dispatch-Thread fasst Größenänderungs-Ereignisse zusammen, so dass Ihr Listener nicht von Anfragen überfordert wird. Dies könnte für Sie ein Nicht-Starter sein, aber es ist erwähnenswert.

2. eifrig
laden mehr Daten zu laden, als Sie auf den 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 auffüllen, ist dies möglicherweise der bessere Ansatz. Tabellendaten sind normalerweise einfach zu laden und zu parsen.

3. eine angemessene Zeit Ändern der Größe passieren Lassen Sie für
Das erste Resize-Ereignis zu stoppen einen Timer mit einem 1-Sekunden-Countdown beginnt. Bei nachfolgenden Größenänderungsereignissen wird der 1-Sekunden-Countdown zurückgesetzt. Zu einem bestimmten Zeitpunkt wird es ein endgültiges Resize-Ereignis geben, nach dem keine nachfolgenden Resize-Ereignisse den Countdown zurücksetzen, so dass er ablaufen darf. An dieser Stelle erledigt der Timer Ihre Ladung für Sie.

Drei ist der sicherste und genaueste Ansatz, meiner Meinung nach. Sie können Ihre Anwendung reagieren lassen, indem Sie sichtbar anzeigen, dass Daten beim ersten Größenänderungs-Ereignis geladen werden, und den Countdown des Timers anpassen, um das richtige Anwendungsgefühl zu erhalten.

Verwandte Themen