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

ElJarno

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:
Code:
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.
Code:
	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
 
Hallo Jan,

wenn du deinen StackTrace mal genauer anschaust, siehst du, dass der Fehler nicht im Code zum Setzen von Tabellenwerten liegt, sondern im RowSorter:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
     at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source)
Es ist keineswegs ein "undefinierbarer" Fehler, sondern du überschreitest die Grenzen des Arrays bzw. der Collection in der angezeigten Funktion convertRowIndexToModel(). Vielleicht hast du einen Fehler beim Inkrementieren oder einen falschen Parameter übergeben.

Gruß
miffi
 
Ne hat ja alles wunderbar funktioniert, beim debuggen wurden ja alle Werte korrekt in das TableModel geschrieben. Aber das war ja mal wieder relativ einfach:rolleyes: hier die Lösung:
Code:
fireTableRowsInserted(0, modelObjects.size() - 1);

Gruß Jan:rolleyes:
 
mein Vorschlag ausm anderen Forum auch hier:

wie setzt du deinen Rowsorter?

wenn du ihn so setzt,
Code:
sorter = new TableRowSorter<TableModel>();
dann änder ihn mal folgendermaßen ab:
Code:
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:mad:

Code:
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
 
Zurück