添加一个TableRowSorter添加值来建模原因java.lang.IndexOutOfBoundsException后:无效范围

ste*_*eve 11 swing jtable tablerowsorter

将TableRowSorter添加到表及其对应的模型之后,任何相应的添加都会特别添加firetabletablerowsinserted导致异常.从测试中可以清楚地看出,GetRowCount()返回的值超出了模型范围.但是,添加分拣机或过滤器后,如何继续向表中添加值对我没有意义?

作为一个例子,我在向表中添加任何内容之前设置行过滤器,然后在我的模型中使用以下调用向表中添加一个值:

this.addRow(row, createRow(trans,row));
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Run Code Online (Sandbox Code Playgroud)

rowcount的大小为1,抛出异常:

java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at com.gui.model
Run Code Online (Sandbox Code Playgroud)

如果我在没有先添加分拣机的情况下执行相同的步骤,一切都很好.我假设我可能需要通知模型分拣机可能已经进行了更改并尝试了以下但仍然返回异常:

this.addRow(row, createRow(trans,row));
this.fireTableStructureChanged()
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Run Code Online (Sandbox Code Playgroud)

我甚至试图通知模型内部的分拣机,在调用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());
Run Code Online (Sandbox Code Playgroud)

最后,我对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);
Run Code Online (Sandbox Code Playgroud)

这是我的模型中的代码,它为模型增加了价值:

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());

                    }
Run Code Online (Sandbox Code Playgroud)

ste*_*eve 0

因此,目前看来,如果您检查模型当前是否处于排序模式,并且如果是这种情况,则仅对排序模型调用更新。否则调用正常模型火灾更新到目前为止一切似乎都有效。不过,我仍然愿意寻求更好的方法来处理这个问题:

                         if(sorter.getRowFilter() != null){
                             sorter.modelStructureChanged();
                           }
                           else
                         this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Run Code Online (Sandbox Code Playgroud)