title: java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 attempting to populate JTable
body: <p>I'm subclassing JTable and using a DefaultTableModel to model my table data.  The following class sets up the JTable, and adds one row to the model.</p>
  
  <pre><code>import java.io.File;
  import java.util.Iterator;
  import java.util.Vector;
  
  import javax.swing.JTable;  
  import javax.swing.table.DefaultTableModel;
  import javax.swing.table.TableColumn;
  
  public class SelectedFileTable extends JTable {
  Vector&lt;File&gt; SelectedFiles = new Vector&lt;File&gt;(); 
  DefaultTableModel Model    = new DefaultTableModel();
  
  TableColumn ColumnName     = new TableColumn();
  TableColumn ColumnSize     = new TableColumn();
  TableColumn ColumnRmIcon   = new TableColumn(); 
  
  ImageFilenameFilter Filter = new ImageFilenameFilter();
  
  public SelectedFileTable() {
      super();
      this.setModel(Model);
  
      ColumnName.setHeaderValue(new String("Name") );
        ColumnName.setMinWidth(200);
      ColumnSize.setHeaderValue(new String("Size") );
        ColumnSize.setMinWidth(50); 
        ColumnSize.setMaxWidth(100);
      ColumnRmIcon.setHeaderValue(new String("Remove?") );
        ColumnRmIcon.setMaxWidth(100);
        ColumnRmIcon.setResizable(false);
  
      this.addColumn(ColumnName);
      this.addColumn(ColumnSize);
      this.addColumn(ColumnRmIcon);
  
      this.setShowVerticalLines(false);
      this.setShowHorizontalLines(true);
  this.setAutoCreateColumnsFromModel(true);
  
  this.addFile( new File("C:/temp/cfk.jpg") );
  }
  public void addFile(File file) {
      System.out.println("FileTable adding: " + file.getName() );
      if ( file.isDirectory() ) { 
          for ( File f : file.listFiles(Filter) ) {
              this.addFile(f);
          }
      } else { 
          if ( Filter.accept(file) ) {
              System.out.println("Accepting file; " + file.getName() );
              SelectedFiles.add(file);
              {
                  String name = file.getName();
                  Long size = new Long( file.length() );
                  String tempstr = new String("X");
  
                  System.out.println("RowItems before: " + Integer.toString(Model.getRowCount()) );
                  Model.addRow( new Object[] { name, size, tempstr } );
                  Model.fireTableDataChanged(); 
                  System.out.println("RowItems start : " + Integer.toString(Model.getRowCount()) );
              }
              System.out.println("Done Accepting file; " + file.getName() );
          }
      }
  }
  public Iterator&lt;File&gt; iterator() { 
      return SelectedFiles.iterator();
  }
  
  }
  </code></pre>
  
  <p>At display/visualization time, the following exception is thrown: </p>
  
  <pre><code>Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 &gt;= 0
  at java.util.Vector.elementAt(Vector.java:432)
  at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:622)
  at javax.swing.JTable.getValueAt(JTable.java:1903)
  at javax.swing.JTable.prepareRenderer(JTable.java:3911)
  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:1897)
  at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
  at javax.swing.JComponent.paintComponent(JComponent.java:743)
  at javax.swing.JComponent.paint(JComponent.java:1006)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paint(JComponent.java:1015)
  at javax.swing.JViewport.paint(JViewport.java:728)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paint(JComponent.java:1015)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paint(JComponent.java:1015)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paint(JComponent.java:1015)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paint(JComponent.java:1015)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paint(JComponent.java:1015)
  at javax.swing.JLayeredPane.paint(JLayeredPane.java:559)
  at javax.swing.JComponent.paintChildren(JComponent.java:843)
  at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4979)
  at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4925)
  at javax.swing.JComponent.paint(JComponent.java:996)
  at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
  at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
  at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
  at java.awt.Container.paint(Container.java:1709)
  at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
  at sun.awt.RepaintArea.paint(RepaintArea.java:224)
  at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:254)
  at java.awt.Component.dispatchEventImpl(Component.java:4060)
  at java.awt.Container.dispatchEventImpl(Container.java:2024)
  at java.awt.Window.dispatchEventImpl(Window.java:1791)
  at java.awt.Component.dispatchEvent(Component.java:3819)
  at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
  at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
  at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
  </code></pre>
  
  <p>I'm ripping my hair out - I haven't been able to find the root cause of this immensely simple use case. </p>