2010-02-26 3 views
1

У меня есть jTable и jButton. При нажатии кнопки actionPerformed метод вызывает другой метод, который содержит цикл while и каждый раз добавляет строку к модели таблицы (DefaultTableModel), хотя цикл. Цикл while может работать в течение нескольких минут, поэтому я хочу, чтобы он отображал в графическом интерфейсе строки, добавляемые в таблицу каждый раз, один за другим. Однако теперь он добавляет все строки в таблицу вместе после завершения цикла, поэтому вместо того, чтобы увеличивать количество строк один за другим в течение нескольких минут, это идет от нескольких минут, показывая таблицу с 0 строками, чтобы затем мгновенно имея тысячи. Я попытался вызвать updateUI, перерисовать и т. Д. В таблице, а также вызвать fireTabledDataChanged и т. Д. На модели, но ничто из этого не имело никакого значения. Я также пытался использовать таймер Swing, но безрезультатно. Я был бы благодарен за любую помощь или руководство, спасибо.Добавить строку в jTable каждый проход через цикл?

ответ

3

Прочитайте раздел из свинг учебник по Concurrency, который более подробно объясняет, как работает EDT. В дополнение к созданию собственного потока и использованию SwingUtilties.invokeLater() вы также можете использовать более новый подход к использованию SwingWorker. В учебнике приведен пример.

Я пытался дозвониться updateUI,

Никогда не делать что-то подобное. Даже если он исправляет вашу проблему, это неправильное решение. Вы не обновляете пользовательский интерфейс, вы обновляете компонент.

1

Если вы используете DefaultTableModel, вызов addRow на вашей модели во время каждой итерации должен обновить модель, которая затем должна обновить JTable. В таблице будет указано, что она будет перекрашена, и этот запрос будет отправлен на EDT. К сожалению, ваш длительный процесс поддерживает другие запросы от обработки EDT. Самое лучшее для вас сделать, это ваша кнопка запуска процесса в рабочем потоке, и этот поток может затем его addRow вызовы выполняются в Runnable, что потеряется на EDT через SwingUtilities.invokeLater

+1

Мой ответ должен был быть почти таким же, когда я увидел, что вы отправили свои сообщения :) - так что я просто дал вам +1 –

Смежные вопросы