title: Why do I need to call getRowSorter().modelStructureChanged() before fireTableRowsInserted()
body: <p>I have a table which extends AbstractTableModel. When data for it arrives, i delete rows and recreate them again with new data. What i do not understand is why do I have to call the following:</p>
  
  <pre><code>getRowSorter().modelStructureChanged();
  </code></pre>
  
  <p>before calling </p>
  
  <pre><code>fireTableRowsInserted();
  </code></pre>
  
  <p>If i do not do this, fireTableRowsInserted() throws me the following exception:</p>
  
  <pre><code>Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 1
      at javax.swing.DefaultRowSorter.setModelToViewFromViewToModel(DefaultRowSorter.java:717)
      at javax.swing.DefaultRowSorter.rowsInserted0(DefaultRowSorter.java:1046)
      at javax.swing.DefaultRowSorter.rowsInserted(DefaultRowSorter.java:851)
      at javax.swing.JTable.notifySorter(JTable.java:4258)
      at javax.swing.JTable.sortedTableChanged(JTable.java:4106)
      at javax.swing.JTable.tableChanged(JTable.java:4383)
      at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
      at javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:215)
      at ems.ui.components.BoundTable$BoundTableModel.addRow(BoundTable.java:189)
      at ems.ui.components.BoundTable.loadData(BoundTable.java:315)
      at ems.ui.components.BoundTable.modelChanged(BoundTable.java:333)
      at ems.model.BaseDataModel.notifyPropertyChange(BaseDataModel.java:541)
      at ems.model.BaseDataModel.listLoadedFully(BaseDataModel.java:456)
      at 
      at ems.network.HTTPProtobufPoller$2.run(HTTPProtobufPoller.java:107)
      at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
      at java.awt.EventQueue.access$000(EventQueue.java:84)
      at java.awt.EventQueue$1.run(EventQueue.java:602)
      at java.awt.EventQueue$1.run(EventQueue.java:600)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
  </code></pre>