JTable вставка данных в схему автоматического обновления

#java #swing #jtable #swingworker

#java #swing #jtable #swingworker

Вопрос:

У меня есть эта JTable, в которой я реализовал функцию автоматического обновления для отображения оставшегося времени каждые 1 минуту или (60000l).

Но я получаю эту проблему, когда строка, которую нужно вставить, еще не завершена (кодирование данных выполняется в самой JTable), данные теряются. Для предотвращения потери данных и без удаления функции автоматического обновления.

Возможно ли приостановить поток (SwingWorker (Void, недействительный) использовался для функции автоматического обновления), чтобы обеспечить возможность вставки / обновления данных без потери?

Комментарии:

1. что вы подразумеваете под «кодирование данных выполняется в самой JTable»; это предложение похоже на запах дизайна… У вас есть какой-нибудь код, чтобы показать нам? В частности, было бы важно проверить swingworker и табличную модель; кроме того, обычно SwingWorker используется только один раз и, похоже, не подходит для вашего варианта использования (автоматическое обновление) как вы его используете?

2. Ну, я создал другой поток внутри SwingWorker (ошибочно). Теперь собираюсь сделать это потоком…

3. Конечно, вы все равно должны иметь в виду, что изменения в JTable (или ее TableModel) должны будут выполняться внутри EDT, поэтому ваш поток должен использовать invokeLater / invokeAndWait для заполнения его результатов в пользовательском интерфейсе.

4. Когда я использовал SwingUtilies. Метод run не запускает и замораживает приложение… (Извините за поздний ответ.)

Ответ №1:

Убедитесь, что автоматическое обновление и обновление происходят в одном потоке. Это предотвратит выполнение автоматического обновления до тех пор, пока не будет выполнено текущее обновление.

Поток отправки событий (EDT) является хорошим кандидатом, тем более что Swing уже содержит платформу для постановки операций в очередь в EDT.

 public void autorefresh() {
    SwingUtilities.invokeLater(
       new Runnable() { 
          ...
          // code to request refresh goes here. 
       }
    );
}