Краткое описание проблемы.
Предположим, у нас есть JTable и пользователь каким-то образом взаимодействует с ним. TableModel этой таблицы постоянно меняется. Как убедиться, что когда пользователь пытается получить некоторую информацию из таблицы, ссылаясь на некоторый константный столбец и текущую выбранную строку (по его rowIndex, который он получил из JTable), он не попадет в ситуацию, когда TableModel изменяется, а его rowIndex, полученный из JTable, является больше не соответствует тому же значению в TableModel.
Ниже приводится первоначальный вопрос, который более подробно объясняет проблему :
Рассмотрим следующую ситуацию:
Существует JTable, который показывает информацию о пользователях о текущих выполняющихся запросах в некоторой системе
Когда в систему поступает новый запрос, в таблицу добавляется новая строка
пользователь может взаимодействовать с таблицей, щелкнув правой кнопкой мыши по строке (в таблице используется модель выбора одной строки) и выбрав опцию в меню (например, отменить, отложить, повторить и т. Д.)
существует отдельный класс, который реализует интерфейс ActionListener (слушает таблицу) и обрабатывает все взаимодействия с пользователем
Когда пользователь выполняет какое-либо действие с таблицей, этот класс проверяет текущую выбранную строку и присваивает некоторые значения для действия пользователя (в основном он берет индекс выбранной строки и затем вызывает tableModel.getValueAt (indexOfSelectedRow, indexVfuuDextColumnIndex))
Теперь рассмотрим сценарий, когда система проходит стресс-тестирование и запросы подаются постоянно с большой частотой. В моем случае это приводит к ошибке, когда иногда класс, обрабатывающий действия пользователя, получает неверную информацию из табличной модели (действие вызывается для одной строки, но действие выполняется для другой, обычно следующей). Я полагаю, что это происходит потому, что во время некоторых начальных этапов обработки таблицы модель класса действий изменяется из-за нового принятого запроса.
Вопрос в том, как это исправить. Я думаю о двух подходах:
использовать что-то вроде invokeAndWait () для инициализации в классе обработки моих действий пользователя (не нравится эта идея, потому что, по моему мнению, это приведет к другим непредсказуемым ошибкам)
создание отдельного класса слушателя, который будет прослушивать выбор пользователя в таблице и сохранять данные из выбранной строки, как только он был выбран отдельно от TableModel. Таким образом, класс обработки действий будет получать данные не из изменяемой модели таблицы, а из выбранной строки, которая является постоянной в описанном сценарии. (не уверен, что эта идея будет работать)
Пожалуйста, прокомментируйте мои идеи и предложите свои.
Прошу прощения за отсутствие какого-либо кода здесь, но оригинальный код займет слишком много места, и пример модели не то, что можно легко сделать здесь.