TableRowSorter... zu langsam

Status
Nicht offen für weitere Antworten.

roxX0r

Mitglied
Ich hab da nochmal ein Prob mit dem TableRowSorter.

Mein Programm liest etwas in einem Seperaten Thread aus, berechnet dort auch etwas und schickt dann an die Tabelle einen Vector, der dort einfach hinzugefügt wird. In meinem extra Thread läuft das so:

Java:
             //Thread arbeitet ....

                EventQueue.invokeLater(new Runnable() {

                    public void run() {

                        //otm ist ein String Vector 
                        model.addaRow(otm);
                        }

                    }
                });

Im Thread gibts ne Schleife, die ca. 1000 mal durchläuft und auch soviele neuen Zeilen in die Tabelle der GUI schreibt. Das funktioniert auch alles sehr schön, nur gibts jetzt ein Problem mit dem RowSorter. Die Tabelle wird rasch sehr groß und ab einer bestimmten größe fängt die GUI an zu haken und nicht mehr zu reagieren, die Informationen des Arbeiter-Threads kommen schneller als der RowSorter die Tabelle sortieren kann (vermute ich). Ist kein RowSorter auf der Tabelle, ist die GUI ganz geschmeidig ... reagiert sofort wenn man auf eine Zeile klickt, oder scrollt. Sobald der rowSorter aktiv ist, hakt es irgendwann.

Jemand eine Idee, wie ich das irgendwie besser hinbekomme ?

Noch kurz zur Implementation der Methode addaRow(): dort wird nur der dataVector der Tabelle um einen Eintrag erweitert und danach wird der TabelRowSorter neu gesetzt. Der muss nach jeder Änderung des DataVectors neu gesetzt werden ...
 

roxX0r

Mitglied
Ja aber während der andere Thread die ganze Zeit neue Rows dranhängt, soll der Benutzer schon die sortierte Tabelle sehen und damit arbeiten. Neue Datensätze sollen dann direkt einsortiert reingeschrieben werden. Funzt alles perfekt, nur die Performance macht irgendwann dicht ... getColumnClass liefert auch direkt Double zurück damit der RowSorter nicht erst konvertieren muss.
Wenn ich das sortieren jetzt selbst implemetiere und dann den dataVector jedesmal mit Collection.sort sortiere... ob das performance bringt?
 

Marco13

Top Contributor
Hm. Ein eigenes TableModel schreiben KÖNNTE schneller sein, aber sicher nicht, wenn du jedes mal Collections.sort machst. Sowas macht der TableSorter ja mit ziemlicher Sicherheit auch: Wenn man 100 Elemente einfügt, dann sortiert er erst 1, dann 2,3,4... dann 99... und nur weil dann noch eins dazukommt, macht er die komplette Sortierung der 99 anderen Elemente nochmal neu - das ist reinste Zeitverschwendung...

Stattdessen könntest du, wenn du sowieso ein eigenes TableModel schreibst, dort eine Methode "addRowSorted" einführen, die einfach durch die intern für die Tabellenzeilen vorliegende Liste läuft, und die neue Zeile an der passenden Stelle einfügt. Damit wird die Tabelle mit jedem einfügen ständig sortiert gehalten. Das wäre sogar einer der wenigen Fälle, wo sich eine LinkedList anbieten würde...
 

musiKk

Top Contributor
Huh? Wieso ist da LinkedList besser? Auf einer ArrayList kann man ja z. B. binäre Suche verwenden. Einfacher klingt aber ein SortedSet.
 

Marco13

Top Contributor
Beim SortedSet ist's mit der Implementierung des indizierten Zugiffs für's TableModel interface ein bißchen schwierig (also, es geht, natürlich... ;) ). Und ... das Einfügen an einer beliebigen Position ist bei LinkedList schneller. Bei einer ArrayList müssen ja alle dahinter liegenden Elemente um 1 weitergeschoben werden.
 

musiKk

Top Contributor
Ok, für indizierten Zugriff ist das Set natürlich nix, das stimmt. Es ging ja hier um ein eigenes Model...
Und bei den Listen... daran habe ich gerade auch nicht gedacht (Abstraktion ist toll). Bei den beiden ist halt der Tradeoff zwischen Zugriff und Speicherung verschieden. Ich würde aber zumindest mal beide Varianten durchprobieren. Dürfte ja keinen großen Aufwand machen.
 

Marco13

Top Contributor
Noch ein anderer Tipp: Je nachdem, um wie viele Zeilen es da geht, könnte es sinnvoll sein, die Zeilen zu sammeln. Also, JEDE Zeile einzeln auf dem EDT in die Tabelle zu legen ist vielleicht gar nicht nötig. Wenn man also z.B. 10000 Zeilen einfügen wollte, wäre es ggf. sinnvoller, nicht 10000x1 Zeile einzufügen, sondern nur 1000x10 Zeilen.
Die Klasse "SwingWorker" bietet schon ansatzweise Mechanismen dafür: Die ruft bei längeren Berechnungen zwischendurch eine Methode (ich glaube "publish") auf, die eine Liste von "Chunks", also kleinen Zwischenergebnissen, liefert (bei dir wären das die Zeilen). Das sortierte Einfügen kann man damit auch recht schnell machen, und es könnte insgesamt noch schneller sein... Musst du aber selbst überlegen/ausprobieren.
 

roxX0r

Mitglied
Danke für die Tipps.

Ich machs jetzt so, dass ich nur alle 30 Teilen die Tabelle neusortiere. Das bringt eigentlich schon sehr viel. Wäre sicher noch möglich, das noch besser hinzubekommen, aber so reichts :)
Danke nochmal
 

Marco13

Top Contributor
Eigentlich war das letzte als eine zusätzliche Möglichkeit gemeint - so kommt er (selbst bei 30er-Blöcken) aus dem Sortieren ja nicht mehr raus... aber ... OK.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T TableRowSorter AWT, Swing, JavaFX & SWT 4
F Swing TableRowSorter sortiert komisch!? AWT, Swing, JavaFX & SWT 4
R TablerowSorter Problem AWT, Swing, JavaFX & SWT 3
R Swing TableRowSorter und Header Renderer AWT, Swing, JavaFX & SWT 2
C Swing Problem mit TableCellRenderer in Verbindung mit TableRowSorter AWT, Swing, JavaFX & SWT 2
A TableRowSorter für double Werte mit Formatierung AWT, Swing, JavaFX & SWT 3
pinerski Swing JTable und TableRowSorter AWT, Swing, JavaFX & SWT 2
T Invalid Range - Fehler bei TableRowSorter / Tabelle AWT, Swing, JavaFX & SWT 17
R Jtable + TableRowSorter AWT, Swing, JavaFX & SWT 9
GilbertGrape Alternative zu TableRowSorter in 1.5 AWT, Swing, JavaFX & SWT 3
G problem mit TableRowSorter AWT, Swing, JavaFX & SWT 5
K javax.swing.table.TableRowSorter AWT, Swing, JavaFX & SWT 13
W Wie setz ich beim TableRowSorter die zu sortierende Spalte AWT, Swing, JavaFX & SWT 4
P TableCellRenderer mit einem TableRowSorter AWT, Swing, JavaFX & SWT 4
P Double-Werte sortieren mit TableRowSorter AWT, Swing, JavaFX & SWT 2
D graphische Ausgabe zu langsam (vsync gzielt abschaltbar?)... AWT, Swing, JavaFX & SWT 13
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
Tommy135 JFileChooser ist sehr langsam AWT, Swing, JavaFX & SWT 13
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
L [Slick2d] Sidescroller/Hintergrundbild sehr langsam AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
P JFrame langsam / seltsames Verhalten AWT, Swing, JavaFX & SWT 6
X JInternalFrame vor Java2D-Zeichnung langsam bzw. Gui friert ein AWT, Swing, JavaFX & SWT 1
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
M JTable mit wechselnden Spalten - sehr Langsam AWT, Swing, JavaFX & SWT 5
A HELP: JFieldText dynamisch setzen -> langsam AWT, Swing, JavaFX & SWT 19
O RandomAccesFile langsam AWT, Swing, JavaFX & SWT 6
lumo AWT Screenshots machen ist langsam? AWT, Swing, JavaFX & SWT 6
P 2D-Grafik g2.drawImage() langsam AWT, Swing, JavaFX & SWT 110
J JApplet langsam wegen vielen Tooltips? AWT, Swing, JavaFX & SWT 36
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
F Swing JTable langsam AWT, Swing, JavaFX & SWT 13
Kr0e VolatileImage langsam AWT, Swing, JavaFX & SWT 10
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
R JTable für sehr viele Daten sehr langsam AWT, Swing, JavaFX & SWT 20
PAX JList aktualisiert zu langsam beim Hinzufügen von Einträgen AWT, Swing, JavaFX & SWT 6
G JScrollPane scrollt zu langsam AWT, Swing, JavaFX & SWT 6
S Bilder werden sehr langsam geladen AWT, Swing, JavaFX & SWT 4
M jFileChooser extrem langsam AWT, Swing, JavaFX & SWT 15
G Swing Programmstart zu langsam AWT, Swing, JavaFX & SWT 3
J JFileChooser öffnet sich in manchen Fällen extrem langsam! AWT, Swing, JavaFX & SWT 12
D Scrollbalken zu langsam AWT, Swing, JavaFX & SWT 10
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
doctus img.getScaledInstance() sehr rechenintensiv und langsam? AWT, Swing, JavaFX & SWT 3
T Linie langsam zeichnen AWT, Swing, JavaFX & SWT 3
C JButton + JFrame Reaktion SEHR langsam. AWT, Swing, JavaFX & SWT 2
J Double-Buffering zu langsam AWT, Swing, JavaFX & SWT 4
A Warum ist jtable.addRowSelectionIntervall so langsam? AWT, Swing, JavaFX & SWT 10
T Swing bei Realtime-Aktualisierung zu langsam? AWT, Swing, JavaFX & SWT 10
C TreeModel zu langsam für EventDispatchThread AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben