Swing Fehler nach Befüllen einer JTable mit gesetzem Rowsort?!

ElJarno

Bekanntes Mitglied
Hi Leute,
habe das Problem, dass ich ein nicht zu identifizierende Thread Exception bekomme die immer dann auftaucht wenn ich Datensätze in die Tabelle über das TableModel hinzufüge wenn zugleich eine Spalte durch den AutoRowSorter als zu sortieren gesetzt ist. Hier mal die Fehlermeldung, weiter unten der Code fürs hinzufügen, auslesen und speichern in die DB:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
	at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source)
	at javax.swing.JTable.convertRowIndexToModel(Unknown Source)
	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.paintToOffscreen(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(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.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(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.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(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)

Die Savemethode und die Methode zum auslesen werden beide hintereinander in einem Thread ausgeführt.
Java:
	public void setModelObjects(Vector<Object> modelObjects)
			throws SecurityException, IllegalArgumentException, SQLException,
			InstantiationException, IllegalAccessException,
			NoSuchMethodException, InvocationTargetException, IOException,
			ParseException {
		if (modelObjects != null && !modelObjects.isEmpty()) {
			Vector<Vector<Object>> spaltenMeta = getSpaltenMetaData();
			addRow(modelObjects.size(), false);
			for (int i = 0; i < modelObjects.size(); i++) {
				Object obj = modelObjects.get(i);
				for (Vector<Object> meta : spaltenMeta) {
					if (meta.get(1) != null) {
						Object value = obj.getClass()
								.getMethod("get" + meta.get(1)).invoke(obj);
						if (value != null) {
							int column = findColumn(meta.get(0).toString());
							setValueAt(value, i, column);
						}
					}
				}
			}
		}
	}

Gruß Jan
 
Das war ja mal wieder relativ einfach:bloed::
Java:
fireTableRowsInserted(0, modelObjects.size() - 1);

Gruß Jan
 
wie setzt du deinen Rowsorter?

sorter = new TableRowSorter<TableModel>();
wenn du ihn so setzt, dann änder ihn mal folgendermaßen ab:
sorter = new TableRowSorter<ThisTableModel>(model);

dadurch werden fast alle NullPointer beim Einfügen von Datensätzen behoben und der fix mit dem -1 wird dadurch nicht mehr benötigt 😉
 
Dat kann echt nich wahr sein, dieser blöde RowSorter macht mich noch fertig😡

Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source)
	at javax.swing.JTable.convertRowIndexToModel(Unknown Source)
	at javax.swing.JTable.getValueAt(Unknown Source)
	at javax.swing.JTable.prepareRenderer(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)

Irgend ne ahnung was man jetzt noch machen kann?

Gruß Jan
 
generell vorsichtig sein mit Änderungen, von wo kommen die denn, von einem anderen Thread
oder nach Button-Klick im normalen Listener?

Änderungscode z.B. in einen Block
> SwingUtilities.invokeLater(new Runnable() { public void run() {
> // CODE
> }});
schreiben
 
Ja aber diesen Thread hab ich schon von anfang an implementiert gehabt. Wie gesagt beim Debuggen funktioniert mal wieder alles einwandfrei nur beim normalen ablauf hab ich diese NullPointer Exception, Würde das was bringen wenn ich den Thread synchronisieren würde sodass der AWT Thread nicht dazwischen funken kann?

Java:
Änderungscode z.B. in einen Block
SwingUtilities.invokeLater(new Runnable() { public void run() {
 // CODE
 }});

Was bringt diese Anweisung eigentlich genau in einem Thread?
 
Zuletzt bearbeitet:
diese Anweisung ist quasi hierfür da:
> Würde das was bringen wenn ich den Thread synchronisieren würde sodass der AWT Thread nicht dazwischen funken kann?

läßt Code (später) vom AWT-Thread ausführen, so dass garantiert ist, dass das nicht mitten während eines Zeichenvorgangs passiert,
eine andere Möglichkeit zur Synchronisation gibts nicht

dass es mal geht, mal nicht, ist ein guter Hinweis dafür, dass invokeLater helfen kann,
aber nicht zuviel erwarten, ist nur grobes Raten
 
Perfekt!!!
Hat funktioniert. Gut geraten würde ich sagen😉.

Nur ist dieses invokeLater jetzt speziell für den AWT Thread, weil ich hatte bisher gedacht, dass ja über synchronized Methoden und kritische Bereiche synchronisiert werden?

Gruß und Danke
Jan
 
wenn du in den AWT-Thread

> synchronized(xy) {
> table.paint(..);
> }

einbauen könntest, ginge das auch, aber du hast ja überhaupt keinen Zugriff auf den AWT-Thread,
außer über komplizierte überschriebene paint-Methoden in beteiligten Komponenten,

so ist invokeLater() eine akzeptable offizielle Alternative
 

Neue Themen


Zurück
Oben