JTable Darstellen der selektierten Zelle braucht lange

Status
Nicht offen für weitere Antworten.
R

redbomber

Gast
Hi zusammen.
Ich habe eine Frage:

Meine JTable besitzt Zellen vom Typ JPanel.
Wenn ich eine Zelle anklicke, soll diese mit einem weissen X markiert werden, was auch funktioniert.
Solange meine Tabelle nur wenige Zellen besitzt geht das sehr schnell.
Bei aber vielleicht 60.000 Zellen klicke ich die Zelle an (diese wird auch gleich korrekt ausgewählt usw.) aber bis diese dann letztendlich markiert wird, vergehen bestimmt 5-10 Sekunden.

Nun frage ich mich woran das liegt. Irgendwas wird hier bestimmt unnötig ausgeführt, aber was?

Mein Renderer kümmert sich um das anpinseln der Zelle:

Code:
public void paint(Graphics g) {
		super.paint(g);
		// paint cross onto selected cell

                // selectedObj ist Objekt welches sich in der Zelle befindet -> nicht jede Zelle kann markiert werden              //da nicht alle gefüllt sind, nur wenn sich auch mein Objekt in der Zelle befindet, kann diese auch ausgewählt werden

                // Selector speichert eine Liste mit allen selektierten Zellen

		if (selectedObj != null && Selector.contains(selectedObj)){
					g.setColor(Color.WHITE);
					g.drawLine(0, 0, getWidth(), getHeight());
					g.drawLine(0, getHeight(), getWidth(), 0);
		}
		selectedProbe = null;
	}


Wird denn diese paint Methode für alle Zellen in der Tabelle aufgerufen?
Oder wird diese für alle sichtbaren Zellen in der Tabelle aufgerufen?

Hat ihr mir vielleicht einen Tip wie ich herausfinde wo die ganze Zeit verloren geht?
 

Ebenius

Top Contributor
1. paintComponent() überschreiben, nicht paint(). Das sollte in Deinem Fall keinen Zeit-Unterschied machen, gehört aber so.

2. Ich tippe darauf, dass "Selector.contains(...)" die Zeit frisst. Ich gehe mal davon aus, dass diese Methode langsamer wird, wenn es mehr Zellen werden. Welche Information gibt Dir die Methode denn? Geht es um die Normale Row-Selection in der Tabelle? Wenn nicht: Vielleicht kannst Du die Information ins Tabellen-Modell verlagern und damit Zeit sparen. Keine Ahnung; ich weiß ja nicht was es bedeutet.

3. Allgemeine Optimierung von TableCellRenderer-Implementationen: Schau dazu mal in den Source-Code der DefaultTableCellRenderer-Klasse und such nach "performance". Da gibt's ein paar Tricks die man machen kann, um's zu beschleunigen.

4. Willst Du tatsächlich 60.000 Zellen in der Tabelle haben, oder handelt es sich nur um einen Test. Im zweiten Fall, spar Dir die Mühe der Optimierung. :)

5. Es werden immer nur die sichtbaren Zellen gerendert. Schrieb ich Dir das nicht schon in einem anderen Thread?

Ebenius
 
R

redbomber

Gast
2. Ich tippe darauf, dass "Selector.contains(...)" die Zeit frisst. Ich gehe mal davon aus, dass diese Methode langsamer wird, wenn es mehr Zellen werden. Welche Information gibt Dir die Methode denn?
Dies ist ein ganz normales Set<Object>, also der Aufruf von set.contains(object);
In dem Set befinden sich alle Objekte welche bisher selektiert wurden.
Wenn ich also nur ein Objekt anklicke dann ist das Set ja leer, also müsste ich sofort das Ergebnis haben.

Geht es um die Normale Row-Selection in der Tabelle? Wenn nicht: Vielleicht kannst Du die Information ins Tabellen-Modell verlagern und damit Zeit sparen. Keine Ahnung; ich weiß ja nicht was es bedeutet.
Ich muss anhand der Row/Col Selection bestimmen ob ich auf eine Zelle klicke, welche ein Object enthält.
Nur wenn die Zelle ein Objekt enthält kann diese auch ausgewählt werden (-> ich schaue auch hier nochmal nach ob bei dem checken ob es sich bei row/col um ein Objekt handelt die Zeit verloren geht).

4. Willst Du tatsächlich 60.000 Zellen in der Tabelle haben, oder handelt es sich nur um einen Test.
Es werden noch weit mehr Daten werden, also muss ich einfach versuchen die Laufzeit zu verbessern.

5. Es werden immer nur die sichtbaren Zellen gerendert. Schrieb ich Dir das nicht schon in einem anderen Thread?
Ja das hattest du, aber ich habe einfach nur nach der Ursache gesucht.
 

0x7F800000

Top Contributor
redbomber hat gesagt.:
Dies ist ein ganz normales Set<Object>, also der Aufruf von set.contains(object);
In dem Set befinden sich alle Objekte welche bisher selektiert wurden.
Wenn ich also nur ein Objekt anklicke dann ist das Set ja leer, also müsste ich sofort das Ergebnis haben.
Hm, auch ein ganz normales Set-Objekt braucht relativ viel zeit für contains(). Wenn dein Set gerade diejenigen elemente beinhaltet, die markiert werden müssen, dann könntest du evtl irgendwie alle elemente durchgehen, und über diese nochmal gesondert ein kreuzchen malen. Aber das dürfte sich schwierig gestalten. Kannst du nicht irgendwie einen einfachen boolean wert für jede zelle abspeichern, der angibt, ob die zelle markiert ist oder nicht?

Oder wenn du da nur große rechteckige Auswahlbereiche hast, dann wäre es womöglich schneller, die position des kästchens mit der position des auswahlbereiches zu vergleichen.
 

Ebenius

Top Contributor
Wenn es eine Eigenschaft der Zelle ist, markiert zu sein oder nicht, dann sollte der Wert im Tabellenmodell diese Information liefern.
 
R

redbomber

Gast
Das mit dem boolean versuche ich gerne,

aber wo habe ich genau die Zelle als Objekt, also dass ich der Zelle einen boolean zuweisen könnte.
Es gibt ja im grunde keine Zelle, ich arbeite ja immer nur mit row/column und erhalte damit dann meine ausgewählten Objekte.
 

Ebenius

Top Contributor
Bevor Du da irgendwas drehst: Du wolltest doch wissen, wie Du herausfindest, warum es so langsam ist...

Zuerst würde ich die paint() (bzw. paintComponent()-Methode) im Renderer auskommentieren und überprüfen, ob es dann merklich schneller ist. Wenn dem so ist, langsam Dinge wieder hinzufügen... Das contains() kannst Du ja einmal mit true und einmal mit false ersetzen, um zu gucken, ob's daran liegt.

Ebenius
 

didjitalist

Bekanntes Mitglied
redbomber hat gesagt.:
4. Willst Du tatsächlich 60.000 Zellen in der Tabelle haben, oder handelt es sich nur um einen Test.
Es werden noch weit mehr Daten werden, also muss ich einfach versuchen die Laufzeit zu verbessern.

auch wenn es durchaus anwendungsfälle gibt, in denen es notwendig ist, soviele zellen in einer tabelle vorzuhalten, ist es bei solchen datenmengen meist sinnvoller, die daten von vornherein nur in gefilterter form anzubieten. und der filter "alle" fehlt schlicht und ergreifend. die frage ist nämlich, welcher anwender tatsächlich etwas sinnvolles mit so riesigen mengen an daten auf einmal anfangen kann.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
M Jtable besser darstellen AWT, Swing, JavaFX & SWT 6
J jTable anders darstellen AWT, Swing, JavaFX & SWT 4
M Swing XML Datei in JTable darstellen + verändern AWT, Swing, JavaFX & SWT 3
C JTable: Mehrere Farben in einer Zelle darstellen AWT, Swing, JavaFX & SWT 10
S Swing JTable: in erster Spalte Image darstellen AWT, Swing, JavaFX & SWT 30
R JTable: Tabelle neu darstellen AWT, Swing, JavaFX & SWT 6
R JTable darstellen von leeren Zellen AWT, Swing, JavaFX & SWT 12
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
G Icon und Text in JTable darstellen AWT, Swing, JavaFX & SWT 3
M JTable text zentriert darstellen AWT, Swing, JavaFX & SWT 5
$ JTree in JTable darstellen und selectieren AWT, Swing, JavaFX & SWT 13
O Dateien aus Verzeichnis filtern und in JTable darstellen AWT, Swing, JavaFX & SWT 3
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
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
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
Thallius Warum refrehsed mein JTable nicht? 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

Ähnliche Java Themen

Neue Themen


Oben