Исключение в "AWT-EventQueue-0" - PullRequest
       1

Исключение в "AWT-EventQueue-0"

1 голос
/ 25 сентября 2011

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

Я делаю простое (ish) приложение в Java, используя Swing для GUI. В настоящее время у меня есть JTable, JList и JButton. Если дважды щелкнуть в таблице строку , она будет добавлена ​​в список. Когда нажата кнопка , настраиваемый fileVisitor проходит по (в настоящее время жестко запрограммированному) каталогу и заполняет таблицу найденными файлами. Список пока ничего не делает. Это все работало, как и ожидалось.

Однако при нажатии кнопки все приложение блокируется на ~ 15 секунд, которые требуется для запуска fileVisitor. Это хорошо, если немного раздражает. Когда обход дерева файлов заканчивается, приложение снова отвечает (и таблица обновляет все строки сразу).

Поэтому я решил поместить вызов Files.walkFileTree в его собственный поток. Сначала это казалось эффективным, так как каждый файл был добавлен в модель таблицы, что было отражено в таблице (которая была настроена на вызов revalidate при изменении модели). Однако, если бы я дважды щелкнул по элементу, пока обход дерева файлов находился в процессе работы, он зависал бы с сообщением: java.lang.NullPointerException, выброшенным из UncaughtExceptionHandler в потоке "AWT-EventQueue-0"

Прочитав немного о колебании, я предположил, что это произошло из-за того, что редактировал модель таблицы из потока, который не был потоком диспетчеризации AWT, и быстро поместил строки, редактирующие модель таблицы, в SwingUtilities.invokeLater (Runnable ) блок. Однако это не решило проблему. Странно (а может и нет, мне кажется странным), иногда срабатывает двойной щелчок, и только после 2 или 3 попыток я вызываю сбой.

Мой вопрос: что может быть причиной этого? Я не вижу ничего, очевидно, неправильного, и все мои поиски в Google указывают на отсутствие поточной безопасности Swings и использование потока диспетчеризации AWT (который, как я думал, и есть invokeLater). Кто-нибудь знает, что не так?

P.S. извините еще раз, если что-то неясно, и что это так долго: P

1 Ответ

1 голос
/ 25 сентября 2011

Было две проблемы: 1) я использовал поток для своего обхода дерева файлов, а не рабочий качания doInBackground; 2) мой код двойного щелчка фактически выдал нулевой указатель, но только если вы правильно выбрали время при обновлении таблицы, я тоже исправил это сейчас. Спасибо за поиск.

...