2 Stimmen

Java JTable mit häufiger Aktualisierung?

Ich kodiere eine JTable, die in der Lage ist, häufige Aktualisierungen zu verarbeiten. Typischerweise hat diese JTable ~1000 Zeilen von Daten, und einige der Spalten werden häufig aktualisieren, weil ihre Werte von Aktienkursen abgeleitet sind, die eine Menge während der Marktstunden bewegt.

Das Problem, das ich konfrontiert bin, ist, dass wenn große # von Zeilen (z.B. 80 %) aktualisiert werden, die JTable sehr langsam für 20-30 Sekunden oder so, die der Profiler zeigt, dass der EDT-Thread extrem beschäftigt ist, Behandlung tableChanged Aufrufe.

Ich versuche, die Änderungen zu reduzieren, indem ich 1) fireTableCellUpdated unterdrücke 2) Wenn es <= 50 Zeilenänderungen gibt, rufe ich fireTableRowUpdate für einzelne Zeilen auf 3) Wenn es > 50 Zeilen Änderungen gibt, rufe ich fireTableDataChanged für die gesamte Tabelle auf.

Es ist besser, aber immer noch langsam, wenn es häufige Updates gibt, mein Verständnis ist, dass fireTableDataChanged auch langsam ist. Also, wenn Daten Updates häufig genug, fireTableDataChanged wird häufig aufgerufen werden, und die GUI wird träge fühlen.

Kann jemand, der sich mit diesem Thema auskennt, eine optimale Vorgehensweise bei der Verwendung von fireTableRowsUpdate empfehlen? fireTableDataChanged und fireTableStructureChanged empfehlen, um die Lebendigkeit und Leistung der GUI zu verbessern? Wenn Sie Hinweise auf Beispielcodes haben, die dieses Problem lösen, wäre das noch besser.

Vielen Dank!

Anthony Si

7voto

SyntaxT3rr0r Punkte 26957

Ich habe das getan, und in der Tat sind die Standard-JTable-Perfs selbst auf leistungsfähigen Systemen furchtbar schlecht. Aber alle Hoffnung ist noch nicht verloren: Mit (ziemlich) wenigen Tricks kann man akzeptable Leistungen erzielen.

Oracle hat genau für diesen Zweck ein Tutorial, den "Weihnachtsbaum".

Hier ist es: "Wie man häufig aktualisierte JTable erstellt, die gut funktionieren":

http://www.oracle.com/technetwork/java/christmastree-138396.html

Eine Sache, die ich wirklich erstaunlich fand, war die ständige Anzeige des verbrauchten Speichers: Das sollten Sie vielleicht tun.

Sie werden erstaunt sein, wie viel unnötiger Mist von einer Standard-JTable erzeugt wird, die alles verlangsamt und natürlich die GC viel öfter auslöst, als sie sollte.

Dann fangen Sie an, alle Tricks aus dem Link, den ich Ihnen gegeben habe, anzuwenden und Sie werden sehen, dass alles laufen wird viel glatter. Ich betreibe jetzt eine sehr komplexe und "ständig aktualisierte" JTable und alles ist jetzt in Ordnung :)

Aber ja, abgesehen vom einfachsten Fall und winzigen Datenmengen ist die Standard-Implementierung von JTable wirklich furchtbar schlecht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X