Hallo,
ich hätte einmal eine Frage zur Geschwindigkeit beim Arbeiten mit großen Datenmengen (10000 Einträge) in einer Tabelle oder einem Tree.
Der CellRenderer wird doch bei jedem Klicken, Scrollen und jeder Mausbewegung durchlaufen. Wie macht sich das auf die Performance im Tree oder der Tabelle bemerkbar wenn der Renderer z.B. ein Panel ist, welches zwei Labels mit Icon und eine Textarea enthält.
Gibt es Tricks beim Umgang mit den Renderern ? Worauf sollte man achten ?
Oder hat der Renderer keinen Einfluß auf die Performance egal wie komplex er aufgebaut ist ?
Danke
Arni
Probiers doch einfach mal aus!
Ein CellRenderer wird schließlich immer durchlaufen. Du kannst natürlich jedes Programm in die Knie zwingen, aber sooooo lahm ist Java auch nicht.
Bei mir wird eine Tabelle mit 22000 Einträgen und nicht geringer Breite innerhalb von unter 4 Sekunden aufgebaut. Inklusive Datenbankabfrage.
Gruß
Peter
Moin
Der CellRenderer wird doch bei jedem Klicken, Scrollen und
jeder Mausbewegung durchlaufen.
Nicht immer: Wenn du z.B. eine JScrollPane mit Doublebuffering hinbekommst wird nicht immer neu aufgebaut.
Ausserdem werden nur die Zellen neu gemalt die 1. angezeigt werden und sich 2. geändert haben können. Der Rest wird kopiert.
Wie macht sich das auf die
Performance im Tree oder der Tabelle bemerkbar wenn der
Renderer z.B. ein Panel ist, welches zwei Labels mit Icon und
eine Textarea enthält.
Sie wird langsamer sein als bei z.B. einem JLabel. Aber merkbar langsamer… ich glaub nicht.
Gibt es Tricks beim Umgang mit den Renderern ? Worauf sollte
man achten ?
kein „new“ im render-code selbst.
keinerlei Layout-befehle/abarbeitung im Code selbst.
Oder hat der Renderer keinen Einfluß auf die Performance egal
wie komplex er aufgebaut ist ?
nee, wenn du z.B. eine java3D-Canvas als Cell-Render benutzt geht die Performance in den Keller. (probiert bei 3x3-Tabellen)
cu
Danke für die Info.
Ich hätte aber nochmals Fragen dazu.
Moin
Der CellRenderer wird doch bei jedem Klicken, Scrollen und
jeder Mausbewegung durchlaufen.
Nicht immer: Wenn du z.B. eine JScrollPane mit Doublebuffering
hinbekommst wird nicht immer neu aufgebaut.
Wie macht man den das mit Doublebuffering ? Gibt es dazu irgendwo Infos. Geht das auch beim Baum ?
Ausserdem werden nur die Zellen neu gemalt die 1. angezeigt
werden und sich 2. geändert haben können. Der Rest wird
kopiert.
Wie macht sich das auf die
Performance im Tree oder der Tabelle bemerkbar wenn der
Renderer z.B. ein Panel ist, welches zwei Labels mit Icon und
eine Textarea enthält.
Sie wird langsamer sein als bei z.B. einem JLabel. Aber
merkbar langsamer… ich glaub nicht.
Gibt es Tricks beim Umgang mit den Renderern ? Worauf sollte
man achten ?
kein „new“ im render-code selbst.
keinerlei Layout-befehle/abarbeitung im Code selbst.
Kein „new“ !? Wenn ich doch einen eigenen Renderer mit z.B. einem Label fürs Icon und einer Textarea machen will muß ich doch das Label und die Textarea mit „new“ anlegen. „New“ brauche ich doch immer wenn ich eigene Componenten auf einem Renderer (extends JPanel) unterbringen möchte. Oder ?
Oder hat der Renderer keinen Einfluß auf die Performance egal
wie komplex er aufgebaut ist ?
nee, wenn du z.B. eine java3D-Canvas als Cell-Render benutzt
geht die Performance in den Keller. (probiert bei
3x3-Tabellen)
Sorry jetzt kommt noch eine Anfängerfrage. Was sind java3D-Canvas ?
Ich kenne bisher nur AWT und Swing.
Danke
Arni
cu
Hallo Peter,
wie sieht bei Dir der Renderer für die Tabelle aus d.h. welche Componenten werden verwendet?
Gruß
Arnfried
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Moin
Wie macht man den das mit Doublebuffering ?
Du erzeugtst im Cellrenderer ein BufferdImage für jede Zelle. Beim ersten „malen“ der Zelle malst du in das BufferedImage und danach das BufferImage ins Graphics-Object. Solange sich die Zelle nicht ändert benutzt du nur noch das BufferedImage. Bei grossen Tabellen/Bäumen sollte man allerdings die maximale Anzahl der Buffer begrenzen (wegen dem Speicherverbrauch)
Gibt es dazu
irgendwo Infos.
In der Doc zu java-1.4 steht ein bisschen was dazu.
Geht das auch beim Baum ?
Das geht bei allen GUI-Elementen (Bei allem was auf dem Schirm angezeigt werden kann)
kein „new“ im render-code selbst.
Kein „new“ !?
Nicht in der Render-Methode selbst:
Alle Label’s, Panel’s, Icon’s … sollten einmal beim erzeugen des Renderers mit angelegt werden und dann immer wieder verwendet werden.
Sorry jetzt kommt noch eine Anfängerfrage. Was sind
java3D-Canvas ?
Es gibt 2 Möglichkeiten unter java schnelle 3D-Darstellungen zu erzeugen: JOGL und java3D. Das funktioniert dann ähnlich wie OpenGL (oder DirectX) und ist für Spiele (JOGL) oder Visualisierungen (java3D) geacht. Kann man sich von sun runterladen, ist beim normalen java nicht dabei.
cu