Невозможно выполнить последовательный поиск

 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;
}

У меня проблема с моим методом поиска выше. То, как я это сделал, позволяет только один раз выполнить поиск по определенному ключевому слову. Находясь в том же графическом интерфейсе, если я выполняю второй поиск, даже если ключевое слово соответствует, результат не будет найден. Я почти уверен, что последний искомый индекс сохранен и проблема не в сбросе, но я не уверен, где и как это изменить.

2 ответа

Допустим, у вас есть таблица из 10 строк с 5 столбцами.

Есть совпадения в:

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

  • Первый раз вы найдете 2, 2.

  • Поэтому в следующий раз вы начнете со строки 2 и столбца 3. Ваш алгоритм будет искать только значения в столбцах 3 и 4 (4 - последний столбец вашей таблицы).

То, что вы должны иметь, это:

  • первый взгляд от ячейки 2, 3 до ячейки 2, 4
  • Затем используйте свои циклы, чтобы начать со строки 3 и столбца 0 и увеличить столбцы -> нет совпадения в строке 3
  • Затем увеличьте строку до 4 и сбросьте столбец до 0. Когда вы увеличите столбец до 1, вы найдете второе совпадение.
  • так далее...

Я еще не проверял, но я думаю, что в вашем внутреннем цикле вы должны инициировать приращение, как это

int j = fromCol

должен быть заменен

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

Вы устанавливаете fromRow а также fromCol vars быть выбранной строкой и столбцом. И тогда вы меняете выбор, чтобы быть там, где найден первый результат. Если при втором поиске найдутся только элементы слева или над текущим выбором, ничего не будет найдено.

Почему бы тебе просто не установить fromRow а также fromCol быть 0, 0 на первом месте?

Другие вопросы по тегам