public void selectNextFileStarting(String string) {
    LOGGER.debug("Looking for file starting with {}", string);
    int selectedRow = tableFiles.getSelectedRow();
    selectedRow = selectedRow < 0 ? 0 : selectedRow;
    LOGGER.debug("Starting search with row {}", selectedRow);
    boolean fullLoop;
    int started = selectedRow;
    do {
      LOGGER.debug("Checking table row {}", selectedRow);
      int convertRowIndexToModel = tableFiles.convertRowIndexToModel(selectedRow);
      LOGGER.debug("Table row {} is row {} from model", selectedRow, convertRowIndexToModel);
      FileObject fileObject = vfsTableModel.get(convertRowIndexToModel);
      LOGGER.debug("Checking {} if begins with {}", fileObject.getName().getBaseName(), string);
      if (fileObject.getName().getBaseName().toLowerCase().startsWith(string.toLowerCase())) {
        tableFiles.getSelectionModel().setSelectionInterval(selectedRow, selectedRow);
        tableFiles.scrollRectToVisible(new Rectangle(tableFiles.getCellRect(selectedRow, 0, true)));
        break;
      }
      selectedRow++;
      selectedRow = selectedRow >= tableFiles.getRowCount() ? 0 : selectedRow;
      fullLoop = selectedRow == started;
    } while (!fullLoop);
  }
Caller responsible for ensuring called from EDT.
We purposefully do not update UI other than indirectly reflecting
the selection.
Current use case is that we are finished with the browser window.
olv-vfs/src/main/java/pl/otros/vfs/browser/VfsBrowser.java