Вы на правильном пути. Надеюсь, это немного прояснит ситуацию ...
Swing не является потокобезопасным. Тем не менее, есть пара вещей, которые вы можете сделать. Один из вариантов - использовать SwingUtilities
, чтобы опубликовать задачу Runnable
в потоке диспетчеризации событий для выполнения. Это позволит вам получать данные из базы данных и обновлять пользовательский интерфейс в отдельном потоке, соблюдая однопоточную модель Swing.
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
// update UI
}
});
Другой вариант, поскольку это длительная задача, заключается в использовании SwingWorker
для предоставления обновлений пользовательского интерфейса либо по завершении, либо во время обработки.
Как видите, оба эти механизма (т. Е. SwingUtilities
и SwingWorker
) позволяют вам назначать такие задачи другим потокам, в то же время предоставляя вам возможность поместить результат (который обычно переводится в действие) на EventQueue
для последующего (и безопасного) исполнения. Независимо от того, какой из них вы выберете, важно помнить, что длительные задачи никогда не должны выполняться в EDT
. И поэтому, как я обнаружил, наиболее важной особенностью любого хорошо спроектированного графического интерфейса является отзывчивость .