fireTableChanged empfindlich?

Sebastian29

Erfahrenes Mitglied
Moin an alle!

Mir ist gerade beim Testen aufgefallen, dass fireTableChanged innerhalb der for-Schleife sehr empfindlich ist, da der TableSorter ( Original von Sun ) bei über 10000 Datensätze irgendwann ( Zufall ) mit mir über NullPointerException schimpft. Bei dieser Exception handelt es sich um die Variable "modelIndex" [ Zeile 250 in TableSorter.java ]!

Beim Debuggen sehe ich natürlich, dass die Schleife Zeilen für Zeilen in die Tabelle setzt. Dafür macht auch die Methode fireTableChanged, trotzdem ist das bei großer Datenmengen sehr empfindlich, finde ich!

Hat jemand von euch auch dieses Problem gehabt? Ich frage mich bloß, warum er mit mir manchmal schimpft? Ist das ein Bug oder habe ich was falsches gemacht?

Code:
for( int i = 0; i < anzahlDerDatensätze; i++ )
{
        .... [Vectorname].setValueAt(...)...

	[Vectorname].fireTableChanged(new TableModelEvent(
		[Vectorname], i, i,
		TableModelEvent.ALL_COLUMNS,
		TableModelEvent.INSERT )
	);
}

Gruß
Sebastian29
 
Hier ist der StackTrace:

Code:
java.lang.NullPointerException
	at com.gselectronic.tabelle.TableSorter.modelIndex(TableSorter.java:250)
	at com.gselectronic.tabelle.TableSorter.getValueAt(TableSorter.java:287)
	at javax.swing.JTable.getValueAt(Unknown Source)
	at javax.swing.JTable.prepareRenderer(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
	at javax.swing.plaf.ComponentUI.update(Unknown Source)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JViewport.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
	at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Was steht denn in Zeile 250 von dem TableSorter? (Das ist nicht die Variable modelIndex sondern die Methode).

Ansonsten reicht es doch auch nach dem Einfügen aller Datensätze einmal ein tableChanged zu feuern oder?
 
Ja, das stimmt, dass modelIndex auch eine Methode ist, aber diese Zeile 250 bezieht sich auf die Variable mit dem selben Name "modelIndex"!

Code:
249    public int modelIndex(int viewIndex) {
250    	      return getViewToModel()[viewIndex].modelIndex;
251    }

Ich habe hier nun die originale Datei TableSorter.java als Zip-Datei angehängt! Da kannst du dir gerne mal anschauen!

Ich vermute, es hat was mit der Sortierung zu tun, d.h. innerhalb der for-Schleife wird es Zeile für Zeile in die Tabelle eingefügt und gleichzeitig auch in der gewählten Spalte sortieren, deshalb könnte es sein, dass der Sortierer irgendwann nicht klar kommt oder?

Wenn ich per for-Schleife ohne fireTableChanged alle Datensätze ins Vector ( [Vectorname] ) packe und danach einmal mit

Code:
		sorter.setTableModel( [Vectorname] );
		table.setModel( sorter );

               .......

setze, dann funktioniert es ohne Probleme!

Der Unterschied zwischen mit und ohne fireTableChanged ist, dass die Daten bei MIT fireTableChanged Zeile für Zeile in die Tabelle eingefügt werden und bei OHNE fireTableChanged alle Datensätze, die im Hintergrund einzeln per Schleife ins Vector gepackt wurden, mit einem Schlag in die Tabelle eingefügt werden!

Ich wollte wissen, warum bei MIT fireTableChanged eine NullPointerException kommt! Wie gesagt, wahrscheinlich wegen dem Problem mit der Sortierung, da die Tabelle, glaube ich, mit Sortieren voreingestellt ist!

Gruß
Sebastian29
 

Anhänge

Zurück