Swing JTable: Mein CellRenderer ist ein Performance-Killer?

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi Leute,

ich hab ein Problem mit meinen CellRenderern. Wenn ich keine eigenen installiere, sondern die defaultmässigen lasse, dann funzt alles wunderbar: Ich kann meinen 6-spaltigen Table maximieren und zB eine Spalte anpacken und wild damit rumfuchteln: Gefühlte 100 fps :toll:

So, sobald ich den 6 Spalten nun meinen eigenen CellRenderer verpasse, und den gleichen Test mache, ruckelt alles extrem stark, d.h. beim Rumspielen mit einer gepackten Column sinken die repaints auf gefühlte 10fps oder weniger. Was mich etwas schockt, denn ich habe inzwischen schon alles soweit minimiert wie es nur geht. Scheinbar ist schon die Klasse, die ich verwende falsch?! (JLabel)

Hier mein "Killer"-Renderer :lol:
Java:
public class TableTextRenderer extends JLabel implements TableCellRenderer {	
	public TableTextRenderer() {
	}

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {

		setText(value == null ? "" : value.toString());
		return this;
	}
}

Ich meine was kann ich denn hier bitteschön falsch machen, ich hab nur 1 Zeile Code :eek:

Es muss wohl am JLabel liegen? Wie zum Teufel schaut denn bitte der default-mässige Renderer aus? Ich bitte um Hilfe...

edit: Fals ich hier schon was falsch mache, ich adde in meinem Table-Constructor die Renderer wie folgt:

Java:
	/* install cell renderer */
		for (int i = 0; i < getColumnCount(); i++) {
			TableCellRenderer r = new TableTextRenderer();
			TableColumn col = getColumnModel().getColumn(i);
			col.setCellRenderer(r);
		}

edit2: Mit nem JPAnel hab ichs auch grad versucht, das macht es auch nicht schneller.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
schau dir mal die Implementierung von DefaultTableCellRenderer an, der auch von JLabel erbt, bzw. die API-Beschreibung der überschriebenden Methoden sowie insbesondere
Implementation Note: This class inherits from JLabel, a standard component class. However JTable employs a unique mechanism for rendering its cells and therefore requires some slightly modified behavior from its cell renderer. The table class defines a single cell renderer and uses it as a as a rubber-stamp for rendering all cells in the table; it renders the first cell, changes the contents of that cell renderer, shifts the origin to the new location, re-draws it, and so on. The standard JLabel component was not designed to be used this way and we want to avoid triggering a revalidate each time the cell is drawn. This would greatly decrease performance because the revalidate message would be passed up the hierarchy of the container to determine whether any other components would be affected. As the renderer is only parented for the lifetime of a painting operation we similarly want to avoid the overhead associated with walking the hierarchy for painting operations. So this class overrides the validate, invalidate, revalidate, repaint, and firePropertyChange methods to be no-ops and override the isOpaque method solely to improve performance. If you write your own renderer, please keep this performance consideration in mind.
DefaultTableCellRenderer (Java Platform SE 6)


dass es soviel ausmacht ist mir allerdings noch nicht aufgefallen,
vielleicht wäre der Effekt schon gemindert, wenn du nicht für jede Column einen eigenen Renderer nimmst,
sondern nur einen für alle,
überschriebenene Methoden sind aber gewiss noch besser
 
Zuletzt bearbeitet von einem Moderator:

Wildcard

Top Contributor
Jup, wenn du in dieser Methode neue Components instanzierst stirbst du den Performance-Tot. Instanziere einen, und fülle dessen Text/Parameter immer neu. Swing platziert die Renderer nicht als physikalische Widgets, sondern ruft deren paint Methode im Kontext des eigenen Graphics Objekt auf.
 
S

SlaterB

Gast
also
/* install cell renderer */
wird doch bestimmt nur einmal ausgeführt, dafür aber ein Renderer pro Column, statt einer insgesamt,
ansonsten verwendet aber der TableTextRenderer sich selbst als JLabel, und 'setzt dessen Text/Parameter immer neu', nicht anders als der DefaultTableCellRenderer?

bei den nicht überschriebenen paint-Methoden, die das ganze verlangsamen, werden aber sicherlich zahllose Objekte umsonst erzeugt,
im allgemeinen unnötigen Aufwand
 

hdi

Top Contributor
Also ich hab jetzt die Adapter-Methoden erzeugt die auch der DefaultRenderer nutzt, und siehe da es läuft perfekt!

Ich werde jetzt auch nur noch einen Renderer erzeugen, statt für jede Spalte einen eigenen. Ich wusste gar nicht dass das so geht.. Aber ne Verständnisfrage: Wäre es nicht trotzdem egal? Ich meine dann hab ich halt 5 solcher Renderer statt nur einen, ob jetzt quasi die paint-Methode von einem einzigen 5 mal aufgerufen wird, oder von 5 verschiedenen jeweisl einmal... Sollte doch keinen Unterschied machen oder?

Auf jeden Fall funzt es jetzt wunderprächtig :D

Aber eine Frage noch: Ich hab mich gefragt ob sowas ähnliches auch für den HeaderRenderer gilt, denn da hab ich auch nen eigenen. Sysout sagt mir der defaultmässige HeaderRenderer ist ein "DefaultTableCellHeaderRenderer", aber in der API gibt es die Klasse nicht :autsch: Ist die privat? Also in der Beschreibung der Klasse JTableHeader steht zumindest nix.
Aber wisst ihr da mehr?

Ansonsten dickes Dankeschön :toll:
 
S

SlaterB

Gast
> ob jetzt quasi die paint-Methode von einem einzigen 5 mal aufgerufen wird, oder von 5 verschiedenen jeweisl einmal... Sollte doch keinen Unterschied machen oder?

wenn die Hintergrundprozesse ausgeschaltet sind, ja dann könnte das praktisch egal sein,
ich meinte, dass das bei nicht-überschriebenen repaint & Co. vielleicht noch zusätzlich Probleme macht,

ganz grob fantasiert:
wenn das JLabel etwa intern eh drauf achtet, dass es nicht mehr als 30x pro Sekunde schwer Arbeit macht um die Performance zu senken,
dann wäre ein solch unnötiges JLabel nicht ganz so schlimm wie 15 derartige JLabel bei 15 Columns
 

hdi

Top Contributor
der Header ist glaube ich nur im Look & Feel oder wer weiß was, ach ich weiß nix
Lol wenn schon von dir so ein Satz kommt dann will ich damit nix zu tun haben ;) Funzt ja jetzt auch supergut. Danke nochmal an alle
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
Y JTable AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben