TableRowSorter をテーブルとそれに対応するモデルに追加した後、特に firetabletablerowsinserted に対応する追加を行うと、例外が発生します。GetRowCount() がモデルの範囲を超える値を返していることはテストから明らかです。ただし、ソーターまたはフィルターが追加された後、テーブルに値を追加し続ける方法は意味がありませんか?
例として、テーブルに何かを追加する前に行フィルターを設定し、モデルで次の呼び出しを使用してテーブルに値を追加します。
this.addRow(row, createRow(trans,row));
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
行数のサイズは 1 で、例外がスローされます。
java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at com.gui.model
最初にソーターを追加せずに同じ手順を実行すると、すべて問題ありません。おそらく、ソーターが変更を加えた可能性があることをモデルに通知する必要があると想定し、次のことを試みましたが、それでも例外が返されました。
this.addRow(row, createRow(trans,row));
this.fireTableStructureChanged()
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
以下のように fire を呼び出す前に、値がモデルに追加されたことをモデル内のソーターに通知しようとしましたが、同様に失敗します:
this.addRow(row, createRow(trans,row));
if(sorter.getRowFilter() != null){
//if a sorter exists we are in add notify sorter
sorter.rowsInserted(getRowCount(), getRowCount());
}
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
最後に、FireTableRowsInsterted(0,0) をハードコーディングしましたが、例外はスローされません。しかし、テーブルには何も追加されませんか? したがって、それは間違いなく OutOfBounds の問題の一種であることはわかっています。私はすべてを見てきましたが、答えを見つけることができないようです。これがどのように機能すると思われるかを誰かが知っているなら、それは非常に役に立ちます。JPanel内でソーターを設定するコードは次のとおりです。
messageTable.setRowSorter(null);
HttpTransactionTableModel m = getTransactionTableModel();
final int statusIndex = m.getColIndex("status");
RowFilter<Object,Object> startsWithAFilter = new RowFilter<Object,Object>() {
public boolean include(Entry<? extends Object, ? extends Object> entry) {
for(char responseCode:responseCodes)
{
if (entry.getStringValue(statusIndex).startsWith(Character.toString(responseCode))) {
return true;
}
}
// None of the columns start with "a"; return false so that this
// entry is not shown
return false;
}
};
m.sorter.setRowFilter(startsWithAFilter);
messageTable.setRowSorter(m.sorter);
モデルに価値を追加するモデル内のコードは次のとおりです。
public void update(Observable o, Object evt) {
if (evt instanceof ObservableEvent<?>) {
ObservableEvent<?> event = (ObservableEvent<?>) evt;
if (event.getElement() instanceof HttpTransaction) {
HttpTransaction trans = (HttpTransaction) event.getElement();
// handle adding of an element
if (event.getAction() == PUT) {
if (includeTransaction(trans)) {
// handle request elements
if (trans.getRequest() != null && idMap.get(trans.getID()) == null) {
idMap.put(trans.getID(), count++);
// transactionManager.save(trans);
int row = idMap.get(trans.getID());
this.addRow(row, createRow(trans,row));
if(sorter.getRowFilter() != null){
sorter.rowsInserted(getRowCount(), getRowCount());
}
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
}