2013-02-22 31 views
1

我有一個JTable,其中有一行是自定義對象,其中一列是倒計時的時間組件。當倒計數達到0時,該行將自動移除。當應用分揀機時刪除JTable行導致IndexOutOfBoundsException

我也有一個通過文本框的過濾器選項,用戶可以輸入數據過濾行。

如果沒有將分揀機應用於JTable,除了過濾之外,一切都可以正常工作(時間計數爲0時自行刪除)。應用分揀機給了我一個「java.lang.IndexOutOfBoundsException:無效指數」

我的自定義表模型看起來像這樣

public Object getValueAt(int rowIndex, int columnIndex) { 

    CustomObject myObject = customObjects.get(rowIndex); 
    if (columnIndex == MyFirstColumn) { 
     return myObject.getData1(); 
    } else if (columnIndex == MySecondColumn) { 
     return myObject.getData2(); 
    } else if (columnIndex == TimeRemainingColumn) { 
     if (myObject.getDate() - System.currentTimeMillis() <= 0) { 

      //If I comment this out I can filter but not remove rows 
      removeRow(myObject); 

      return 0; 
     } 
     else{ 
      fireTableDataChanged(); 
      return myObject.getDate() - System.currentTimeMillis(); 
     } 
    } 

    return DateFormat.getDateInstance().format(new Date(myObject.getDate())); 
} 


public void removeRow(CustomObject object) { 
    int row = customObjects.indexOf(object); 
    customObjects.remove(object); 
    fireTableRowsDeleted(row, row); 
} 

這引發此異常

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index 
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:514) 
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2645) 
at javax.swing.JTable.getValueAt(JTable.java:2720) 
at javax.swing.JTable.prepareRenderer(JTable.java:5718) 
at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684) 
at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581) 
at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365) 
at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276) 
at javax.swing.JComponent.paintComponent(JComponent.java:778) 
at javax.swing.JComponent.paint(JComponent.java:1054) 
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) 
.... 

要DefaultRowSorter.java它擊中此例外

public int convertRowIndexToModel(int index) { 
    if (viewToModel == null) { 
     if (index < 0 || index >= getModelWrapper().getRowCount()) { 
      throw new IndexOutOfBoundsException("Invalid index"); 
     } 
     return index; 
    } 
    return viewToModel[index].modelIndex; 
} 

上一個另一個級別,爲什麼未經分揀機移除作品(分揀機== NULL)

public int convertRowIndexToModel(int viewRowIndex) { 
    RowSorter sorter = getRowSorter(); 
    if (sorter != null) { 
     return sorter.convertRowIndexToModel(viewRowIndex); 
    } 
    return viewRowIndex; 
} 

調試了一下FIRSTROW和endRow均爲0,在這一點上(他們應該是什麼?),但它似乎是試圖排序/篩選空列表

我的繼承人表的代碼

myModel = new CustomObjectDataModel(); 

    myTable.setModel(myModel); 
    mySorter = new TableRowSorter(myModel); 

    myTable.setRowSorter(mySorter); 
    myTable.setAutoCreateRowSorter(true); 

我搜索了一圈,發現死鏈接,以表明這是Java中的一個錯誤,但無法證實。

+1

1)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 2)*「發現死鏈接提示這是一個錯誤」*如果他們是死鏈接,他們怎麼可以與你溝通?你有沒有做過一件事? ;) – 2013-02-22 17:42:06

+0

我會看看我是否可以發佈一個工作示例,只要死鏈接去。在互聯網上搜索我的問題已經導致我遇到類似問題的網站,並引用無效的Java頁面。 – Shoe 2013-02-22 17:51:35

+1

我不認爲你的自動清除策略是一個很好的策略,即使有效。我會使用後臺作業,每秒鐘都會刪除過時的行(使用Swing Timer)。這樣,你永遠不會有'getRowCount()'返回的行數與你可以用來調用'getValueAt()'的指數相矛盾的情況。 – 2013-02-22 17:53:19

回答

0

我使用Swing Timers實現了這一點,而不是像建議的那樣解決了這個問題,但是這裏的問題是修改EDT之外的表模型。