Hallo,
ich habe ein Problem mit Tabellen, deren Spalten sortiert sind.
Beim Programmstart verknüpfe ich über folgende Methode TableSorter mit Tabellen:
Zwischendurch werden die Tabelleninhalte immer mal wieder mit Daten neu erstellt, und zwar so:
Das klappt erstmal ohne Probleme. Sobald ich aber eine Tabellenspalte per Mausklick auf die Spaltenüberschrift sortiere, und anschließend irgendwann den Tabelleninhalt wieder neu erstelle, kommt es zu folgender Fehlermeldung:
Muss ich, sobald irgendwann mal eine Tabellenspalte vom Anwender per Klick auf die Spaltenüberschrift sortiert wurde, beim erneuten Erstellen der Tabelleninhalte den RowSorter irgendwie abstellen, oder wie kann ich hier die NullPointer-Exception vermeiden?
Gruß
Daniel
ich habe ein Problem mit Tabellen, deren Spalten sortiert sind.
Beim Programmstart verknüpfe ich über folgende Methode TableSorter mit Tabellen:
Code:
private void setCustomTableRowSorter(JTable table, int column) {
// create new table sorter
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
// tell this jtable that it has an own sorter
table.setRowSorter(sorter);
// and tell the sorter, which table model to sort.
sorter.setModel((DefaultTableModel)table.getModel());
// in this table, the first column needs a custom comparator.
try {
sorter.setComparator(column,new Comparer());
// in case we have the table with titles, we make an exception, because
// this table has two more columns that should be sorted, the columns with
// the entries timestamps.
if (table==jTableTitles) {
sorter.setComparator(2,new DateComparer());
sorter.setComparator(3,new DateComparer());
}
}
catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
}
Zwischendurch werden die Tabelleninhalte immer mal wieder mit Daten neu erstellt, und zwar so:
Code:
// reset the table
tableModel.setRowCount(0);
// go through all entries of the datafile
for (int cnt=1; cnt<=dataObj.getCount(CDaten.ZKNCOUNT); cnt++) {
// get zettel-title
String title = dataObj.getZettelTitle(cnt);
...
...
// create a new object with these data
Object[] ob = new Object[4];
ob[0] = cnt; // ob[0] = String.valueOf(cnt);
ob[1] = title;
ob[2] = created;
ob[3] = edited;
// and add it to the table
tableModel.addRow(ob);
// update progressbar
setProgress(cnt,0,dataObj.getCount(CDaten.ZKNCOUNT));
}
Das klappt erstmal ohne Probleme. Sobald ich aber eine Tabellenspalte per Mausklick auf die Spaltenüberschrift sortiere, und anschließend irgendwann den Tabelleninhalt wieder neu erstelle, kommt es zu folgender Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:501)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2564)
at javax.swing.JTable.getValueAt(JTable.java:2639)
at javax.swing.JTable.prepareRenderer(JTable.java:5653)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:155)
at javax.swing.JComponent.paintComponent(JComponent.java:763)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent._paintImmediately(JComponent.java:5096)
at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:749)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:300)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:210)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:204)
at java.awt.Dialog$1.run(Dialog.java:1045)
at java.awt.Dialog$3.run(Dialog.java:1097)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1095)
at java.awt.Component.show(Component.java:1422)
at java.awt.Component.setVisible(Component.java:1375)
at java.awt.Window.setVisible(Window.java:806)
at java.awt.Dialog.setVisible(Dialog.java:985)
at org.jdesktop.application.SingleFrameApplication.show(SingleFrameApplication.java:296)
at zettelkasten.ZettelkastenView.showTitles(ZettelkastenView.java:3581) (<- Diese Methode will den Zelleninhalt neu erstellen)
at zettelkasten.ZettelkastenView.updateTabbedPane(ZettelkastenView.java:1125)
at zettelkasten.ZettelkastenView.finishedEditing(ZettelkastenView.java:5053)
at zettelkasten.CNewEntry.applyChanges(CNewEntry.java:2298)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jdesktop.application.ApplicationAction.noProxyActionPerformed(ApplicationAction.java:662)
at org.jdesktop.application.ApplicationAction.actionPerformed(ApplicationAction.java:698)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.java:6126)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5891)
at java.awt.Container.processEvent(Container.java:2102)
at java.awt.Component.dispatchEventImpl(Component.java:4497)
at java.awt.Container.dispatchEventImpl(Container.java:2160)
at java.awt.Component.dispatchEvent(Component.java:4327)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4366)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4030)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3960)
at java.awt.Container.dispatchEventImpl(Container.java:2146)
at java.awt.Window.dispatchEventImpl(Window.java:2440)
at java.awt.Component.dispatchEvent(Component.java:4327)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:300)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:210)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:195)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:187)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
BUILD SUCCESSFUL (total time: 30 seconds)
Muss ich, sobald irgendwann mal eine Tabellenspalte vom Anwender per Klick auf die Spaltenüberschrift sortiert wurde, beim erneuten Erstellen der Tabelleninhalte den RowSorter irgendwie abstellen, oder wie kann ich hier die NullPointer-Exception vermeiden?
Gruß
Daniel