Решение, которое я выбрал, не было таким простым, как я надеялся, но имеет удовлетворительные характеристики.
Используемые таблицы - это виртуальные таблицы, которые могут быть очень большими. Таким образом, при загрузке набора данных мы запускаем поток для построения индекса в виде списка. Поскольку эти таблицы могут быть очень большими (но не часто), мы устанавливаем ограничение в 50 МБ для этого списка и прекращаем индексировать его при попадании в него. В большинстве случаев это вполне приемлемо, но для больших таблиц это означает, что, хотя оно может быть медленнее, оно значительно более стабильно, чем другие варианты.
'search' - это простое текстовое поле SWT с ModifyListener, которое выполняет итерации по списку, выполняя 'содержащий' для каждой записи. При совпадении строка и столбец рассчитываются по порядковому номеру (0 = 0,0, 1 = 0,1 ..).
Было бы неплохо иметь для этого простое решение, но во всех предлагаемых таблицах было слишком много функций.