Gibt es eine Möglichkeit, Jxtable.packall () auf eine Weise aufzurufen, die den Swing -Thread nicht sperrt?

StackOverflow https://stackoverflow.com/questions/5343364

Frage

Ich zeige viele Daten in JXTable von dem Swingx Projekt. Nach dem Laden der Daten rufe ich an packAll() Auf dem Tisch, aber mit 200 hundert Spalten und 30.000 Rekorde kann es 5 Sekunden oder mehr dauern. Ich nenne dies aus dem Swing -Thread, was bedeutet, dass die Benutzeroberfläche für diese 5 Sekunden eingesperrt ist. Ich habe versucht anzurufen packAll Auf einem Hintergrundfaden und wie ich vermutete, hat dies eine seltsame Seite auswirken. Nach dem Anruf packAll(), Wenn ich die Maus über die Tabelle schwebe, scheinen alle Zahlen in der Tabelle ständig auf unterschiedliche Zahlen zu aktualisieren. Gibt es eine Möglichkeit, eine angemessene Benutzererfahrung in jxtable zu erhalten, wenn ich die Spalten einer so großen Tabelle packt?

War es hilfreich?

Lösung

Diese Schleife ColumnFactory Tötet dich:

for (int r = 0; r < getRowCount(table); r++) {
        Component comp = renderer.getTableCellRendererComponent(table, table
                .getValueAt(r, column), false, false, r, column);
        width = Math.max(width, comp.getPreferredSize().width);
}

Sie sollten wahrscheinlich nur die Spaltenbreiten selbst einstellen oder vielleicht nur eine Zeile laden, die Tabelle packen und dann den Rest der Daten laden.

Andere Tipps

Jay, weiß nicht, welcher Teil der Antwort, die Sie als richtig gekennzeichnet haben, mit "ausgezeichneter Idee" - es ist zumindest ein bisschen unklar. Die beiden Vorschläge waren:

a) Machen Sie es selbst: Öffnen Sie die Frage, wann und wo und wie genau B) zwei Schritte beladen, was letztendlich nur auf die Messung der ersten geladenen Reihe hinausgeht. Was bereits in ColumnFactory bereitgestellt wird, lesen Sie bitte das API -DOC für GetRowCount (jxtable).

Auch wenn Ihr Kontext nicht so einheitlich ist, dass sie durch eine einfache Überschreibung von getrowcount () gelöst werden, ist ein benutzerdefinierter Spaltenfaktor der richtige Weg: Sie können die von Ihnen ausgewählte Messstrategie implementieren :-)

@Z7SG: Nichts "töten" etwas - wie Sie vielleicht bemerkt haben, wenn Sie das API -DOC gelesen hätten ;-) Die Messung von Zellen ist nicht ganz trivial. Eine Standardimplementierung kann nicht alles passen. Deshalb ist ColumnFactory für Erweiterung ausgelegt: Unterklasse und Passen Sie an Ihre Bedürfnisse an.

Prost Jeanette

200 Säulen und 30.000 Zeilen werden sich einen Moment Zeit nehmen, um zu rendern. Ich glaube nicht, dass Sie die Wartezeit beseitigen können, es sei denn, Sie tun etwas Drastisches. Ihre beste Wette könnte sein, die Tabelle erst zu zeigen, wenn die Daten geladen sind.

Sie sagen, Sie haben 200 Spalten? Nun, ich bezweifle, dass alle 200 gleichzeitig sichtbar sind. Was ist also, wenn Sie gerade die erste 10-20-Spalte packen? Dies sollte die Zeitverzögerung um 1/10 oder 1/20 verkürzen.

Wenn Jxtable nicht erlaubt, einzelne Spalten zu packen, können Sie versuchen, die zu verwenden Tabellenspalte Einsteller Was ich denke, liefert die gleiche Funktionalität auf einem regulären JTabell. Sie können einzelne Spalten packen.

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