In meiner Anwendung lade ich Daten ab, wenn die Größe der Komponente geändert wird. Ich möchte den Abruf verzögern, bis der Benutzer die Größenänderung abgeschlossen hat. ComponentListener
Ereignis componentResized
wird jedes Mal ausgelöst, wenn die Größe des Fensters geändert wird.So ermitteln Sie die Instanz, wenn die Komponentengrößenänderung abgeschlossen ist
Antwort
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();
}
}
Dies ist nicht möglich. Sie können jedoch SingleWorkerThread verwenden, um die Anzahl der verarbeiteten Ereignisse zu minimieren.
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.
- 1. Wix Öffnen Sie die Webseite, wenn die Deinstallation abgeschlossen ist
- 2. So ermitteln Sie, ob Pheanstalk-Jobs abgeschlossen sind
- 3. So ermitteln Sie, ob die Methode zur Laufzeit asynchron ist
- 4. So ermitteln Sie die verwendete ckeditor-Konfiguration
- 5. So ermitteln Sie die Änderungsstatistik zwischen Revisionen
- 6. So ermitteln Sie die OpenCV-Version
- 7. Wenn SendAsync abgeschlossen ist?
- 8. So ermitteln Sie die Länge der Audiodatei, die mit AVAudioPlayer verknüpft ist
- 9. JavaScript Introspektion, die abgeschlossen ist
- 10. So löschen Sie die Instanz in EC2?
- 11. So ermitteln Sie die Version von MagicalRecord, die ich verwende
- 12. So ermitteln Sie die SQL Server-Version auf einem Berichtsserver
- 13. So ermitteln Sie die Steuerungsklasse angegebene URL-Zeichenfolge
- 14. So verwenden Sie die Methodensammlung geändert von Auto abgeschlossen
- 15. So ermitteln Sie die Benutzerrolle, die von der Datenbank empfangen wurde, wenn admin oder nicht
- 16. Erstellen Sie die Instanz
- 17. Wie wird ein Befehl ausgeführt, wenn die Animation abgeschlossen ist?
- 18. Warum $ .when() nicht warten, wenn die Funktion abgeschlossen ist?
- 19. Fortschrittsbalken wird erst angezeigt, wenn die Aufgabe abgeschlossen ist
- 20. So ermitteln Sie, ob NSString leer ist
- 21. MQTT: Erkennen, ob die Übermittlung abgeschlossen ist
- 22. Lassen Sie msiexec warten, bis die Installation abgeschlossen ist
- 23. Ermitteln Sie die Scroll-Position
- 24. So ermitteln Sie die UID einer Nachricht in IMAP
- 25. So ermitteln Sie die ausgehende IP-Adresse der Azure-Website?
- 26. So ermitteln Sie die Bildlaufrichtung, ohne tatsächlich zu scrollen
- 27. Fragment - Warten Sie, bis die Transaktionsanimation abgeschlossen ist
- 28. .Continue startet, bevor die Aufgabe abgeschlossen ist
- 29. Füllen Sie Lücken durch Zusammenführen mit Datenrahmen, die abgeschlossen ist?
- 30. Die Befehlszeile wartet nicht, bis die exe-Ausführung abgeschlossen ist.
Vielen Dank für Ihre Zeit, um detaillierte Beispiel zu schreiben; Diese Lösung scheint meiner Anforderung zu entsprechen. –