Hi,
ich habe Race Conditions beim Starten meines Programms. Es wird ein JTable erstellt, und auch gleich ein "Päkchen" SortKeys Anschließend adde ich in einer Schleife Daten in meinem TableModel, und ich rufe nach jedem add ein fireTableDataChanged() auf.
Da zu dieser Zeit ja schon SortKeys gesetzt sind, ordnet er neue Zeilen entsprechend ein. Es funktioniert alles "wunderbar", also ich meine ich konnte noch nicht feststellen dass er etwas falsch oder gar nicht einsortiert hat.
Allerdings krieg ich trotzdem manchmal eine Exception, und schöner wäre es natürlich wenn das nicht passiert (auch wenn das eben keine wirkliche Auswirkung auf die Stabilität oder Funktion meines Programms hat).
Die Meldung:
Damit es keine Missverständnisse gibt, hier noch mal die entsprechenden Code-Ausschnitte zu meiner Beschreibung oben:
// passiert im Konstruktor meines Tables
Danach fang ich an die Daten ins TableModel zu adden:
Also die Frage ist wieso es zu Race Conditions kommt, und welche Methode ich synchronisieren sollte. Irgendwie wird der RowSorter ja auf das Model des Tables zugreifen, aber welche Methode ruft er auf? Wenn ich diese dann synchronisiere, und auch die addMovie()-Methode synchronisiere, dürfte der Fehler doch nicht mehr auftreten oder?
Danke
ich habe Race Conditions beim Starten meines Programms. Es wird ein JTable erstellt, und auch gleich ein "Päkchen" SortKeys Anschließend adde ich in einer Schleife Daten in meinem TableModel, und ich rufe nach jedem add ein fireTableDataChanged() auf.
Da zu dieser Zeit ja schon SortKeys gesetzt sind, ordnet er neue Zeilen entsprechend ein. Es funktioniert alles "wunderbar", also ich meine ich konnte noch nicht feststellen dass er etwas falsch oder gar nicht einsortiert hat.
Allerdings krieg ich trotzdem manchmal eine Exception, und schöner wäre es natürlich wenn das nicht passiert (auch wenn das eben keine wirkliche Auswirkung auf die Stabilität oder Funktion meines Programms hat).
Die Meldung:
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)
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.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)
Damit es keine Missverständnisse gibt, hier noch mal die entsprechenden Code-Ausschnitte zu meiner Beschreibung oben:
// passiert im Konstruktor meines Tables
Java:
List<SortKey> sortKeys = new ArrayList<SortKey>();
for (int i = 0; i < getColumnCount(); i++) {
sortKeys.add(new SortKey(i, SortOrder.ASCENDING));
}
getRowSorter().setSortKeys(sortKeys);
Danach fang ich an die Daten ins TableModel zu adden:
Java:
public void addMovie(Movie m) {
movies.add(m); // darauf basiert mein Datenmodel
fireTableDataChanged();
}
public void readDBFile() {
for (int i = 1; i <= 50; i++) {
addMovie(new Movie(i+""));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Also die Frage ist wieso es zu Race Conditions kommt, und welche Methode ich synchronisieren sollte. Irgendwie wird der RowSorter ja auf das Model des Tables zugreifen, aber welche Methode ruft er auf? Wenn ich diese dann synchronisiere, und auch die addMovie()-Methode synchronisiere, dürfte der Fehler doch nicht mehr auftreten oder?
Danke