Добавить строку в jTable каждый проход через цикл? - PullRequest
1 голос
/ 26 февраля 2010

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

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

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

Я пытался вызвать updateUI,

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

1 голос
/ 26 февраля 2010

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

...