2013-02-05 40 views
1
public boolean searchSummaryData(String textToFind) { 
    int fromRow, fromCol; 
    fromRow = summaryTable.getSelectedRow(); 
    fromCol = summaryTable.getSelectedColumn(); 

    if (fromRow < 0) { 
     fromRow = 0; //set to start point, first row 
    } 
    if (fromCol < 0) { 
     fromCol = 0; 
    } else { 
     fromCol++;//incremental search - look through each columns, then switch to next row 
     if (fromCol >= summaryTable.getColumnCount()) { 
      fromCol = 0; 
      fromRow++; 
     } 
    } 
    for (int i = fromRow; i < summaryTableModel.getRowCount(); i++) { 
     for (int j = fromCol; j < summaryTableModel.getColumnCount(); j++) { 
      final Object valueAt = summaryTableModel.getValueAt(i, j); //point to object at i,j 
      if (valueAt != null) { 
       textToFind = textToFind.toLowerCase(); 
       if (valueAt.toString().toLowerCase().contains(textToFind)) { 
        //Map the index of the column/row in the table model at j/i to the index of the column/row in the view. 
        int convertRowIndexToView = summaryTable.convertRowIndexToView(i); 
        int convertColIndexToView = summaryTable.convertColumnIndexToView(j); 
        summaryTable.setRowSelectionInterval(i, i); 
        summaryTable.setColumnSelectionInterval(j, j); 
        //Return a rectangle for the cell that lies at the intersection of row and column. 
        Rectangle rectToScrollTo = summaryTable.getCellRect(convertRowIndexToView, convertColIndexToView, true); 
        tableSp.getViewport().scrollRectToVisible(rectToScrollTo); 
        return true; 

       } 
      } 
     } 
    } 
    return false; 
} 

我遇到了上述搜索方法的问题。我这样做,它只允许我搜索一次特定的匹配关键字。在同一个GUI屏幕中,如果我进行第二次搜索,即使匹配关键字,也不会找到任何结果。我很确定上次搜索到的索引是保留的,而不是重置是问题,但我不确定在哪里以及如何更改。无法执行连续搜索

回答

1

您正在将fromRowfromCol变量设置为选定的行和列。然后,您将选择更改为找到第一个结果的位置。如果第二次搜索只能找到当前选择左侧或上方的内容,则不会找到任何内容。

为什么不把fromRowfromCol设置为0,0呢?

+0

我刚刚试过这个,仍然不正确,有时即使匹配,第一列中的值也没有被拾取,但是对于同一行,找到第二或第三列:/ – MooHa

+1

如果他重置fromRow和fromCol到0,0,那么他会不断找到相同的单元格。他正在尝试执行增量搜索。 –

+0

啊,很好的电话。我不明白该方法的名称。 – I82Much

1

比方说,你有一个10列,5列的表。

有火柴:

  • 2,2
  • 4,1
  • 9,0

  • 第一次,你会发现2,2

  • 所以下一次您在第2行和第3列开始。您的算法将仅查找 列3和4中的值(4是您的表格的最后一列E)。

你应该拥有的是:

  • 从小区2,3先来看看,直到电池2,4
  • 然后用你的循环,从3行和列0和增量columns--启动>第3行不匹配
  • 然后将行增加到4并将列重置为0.当您将列增加到1时,您将找到第二个匹配项。
  • 等...

我还没有测试过,但我认为在你的内部循环,你应该开始这样

int j = fromCol 

增量应

被替换
int j = (i == fromRow ? fromCol : 0); 
+0

已经尝试过您的更改,搜索并不灵活。匹配时间仍然不显示。当我到达最后一行时,你不能搜索以前的行。即在第7行找到某人,然后在第二个搜索行5匹配的项目即使匹配也不会工作,第一个搜索后第一列完全不可搜索 – MooHa

+0

@MooHa这是纯算法逻辑。如果您到达表格末尾并想执行某种“换行搜索”(即也检查表格的开始处的项目),则需要在之后重置计数器。当然,你必须确保如果你找到当前选中的单元格,那么找不到其他的匹配。 –