После почти целого дня попыток и поиска в Интернете/SO я прошу совета, и мой вопрос:
Как программно заморозить текущий выбор в JList и вернуться к нормальному поведению?
Прежде всего, немного контекста: у меня есть JList со списком элементов, для каждого из которых может быть запущено вычисление, которое может занять много времени (60 секунд), которое выполняется асинхронно с помощью Свингворкер. Индикатор выполнения показывает, что программа действительно выполняет вычисления и не зависает. Пока поток работает, я не хочу, чтобы пользователь мог изменить выбранный элемент в моем списке. Когда поток завершится, я хотел бы вернуться к нормальному поведению списка.
Я перечисляю мои попытки:
1) проверка моего «условия» (метод isComputing()) в ListSelectionListener и просто возврат, если он вычисляет:
@Override
public void valueChanged(ListSelectionEvent e) {
if(e.getSource().equals(listSCCs)){
if(isComputing())
return;
[...]
}
Проблема в том, что я понял, что прослушиватель запускается после любого изменения выбора, поэтому это не помогает.
2) Добавить полностью пустую реализацию MouseListener в список при вычислении, удалив ее в конце вычисления. По моему мнению, он перехватил бы события мыши в списке и аннулировал их, но список, похоже, не пострадал.
3) Мой последний шанс - вернуться к "исходному" выбору, когда статус вычисления активен в ListSelectionListener (если новый выбор отличается от "исходного", чтобы избежать бесконечной рекурсии по событию изменения), но я действительно не нравится это решение, и я надеюсь, что есть более элегантные.