Threads Komischer NullPointerException

lara99

Mitglied
Hi, ich habe eine JTable, ein DefaultTableModel und ein TableRowSorter. Die Tabelle ist immer nach einer Spalte sortiert. Fehlermeldung:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot read field "modelIndex" because "this.viewToModel[index]" is null
        at java.desktop/javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:508)
        at java.desktop/javax.swing.JTable.convertRowIndexToModel(JTable.java:2629)
        at java.desktop/javax.swing.JTable.getValueAt(JTable.java:2706)
        at java.desktop/javax.swing.JTable.prepareRenderer(JTable.java:5724)
        at java.desktop/javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2190)
        at java.desktop/javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2092)
        at java.desktop/javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1888)
        at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
        at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
        at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
        at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
        at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
        at java.desktop/javax.swing.JViewport.paint(JViewport.java:737)
        at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
        at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
        at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5255)
        at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
        at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
        at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
        at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
        at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5203)
        at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5013)
        at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
        at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
        at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
        at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
        at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

[CODE lang="java" highlight="4, 6"]DefaultTableModel dtm = new DefaultTableModel(1, 1);

// Der folgende Code wird in einem Thread ausgeführt:
dtm.setRowCount(0);
for (Asset a : assets.values()) {
dtm.addRow(new Object[] { a.name });
}[/CODE]

Hatte den Fehler jemand schon mal? ....
 
Beste Antwort
Aus dem Bauch heraus - das Modell aus einem Thread zu aktualisieren hört sich gefährlich an. Meines Erachtens sollte das per invokeLater passieren. Denn generell gilt: Änderungen an Objekten, die in der UI genutzt werden dürfen nur im Event Dispatching Thread passieren.
Aus dem Bauch heraus - das Modell aus einem Thread zu aktualisieren hört sich gefährlich an. Meines Erachtens sollte das per invokeLater passieren. Denn generell gilt: Änderungen an Objekten, die in der UI genutzt werden dürfen nur im Event Dispatching Thread passieren.
 
Beste Antwort
Vielen Dank @LimDul 😁 Das Problem ist gelöst.... Du hattest genau den richtigen Riecher... Da das Umsortieren im EDT stattfindet, muss die Aktualisierung der UI auch im EDT passieren, damit die NPE nach setRowCount(0) nicht auftritt. 😁
VG Lara 😘
 

Neue Themen


Zurück
Oben