无法连续搜索

时间:2013-02-05 22:07:13

标签: java swing for-loop jtable abstracttablemodel

 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屏幕中,如果我进行第二次搜索,即使匹配关键字,也找不到结果。我很确定最后搜索的索引是保留的,而不是重置是问题,但我不确定在哪里以及如何更改它。

2 个答案:

答案 0 :(得分:1)

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

为什么不首先将fromRowfromCol设为0,0?

答案 1 :(得分:1)

假设您有一个包含5列的10行表。

有以下匹配项:

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

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

  • 因此,下次从第2行和第3列开始。您的算法只会查找值 第3列和第4列(4是表格的最后一列)。

你应该拥有的是:

  • 首先从单元格2,3看到单元格2,4
  • 然后使用你的循环从第3行和第0列开始并增加列 - &gt;第3行没有匹配
  • 然后将行增加到4并将列重置为0.当您将列增加到1时,您将找到第二个匹配项。
  • 等...

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

int j = fromCol

应替换为

int j = (i == fromRow ? fromCol : 0);