Поскольку вы выполняете запросы в том же потоке, что и пользовательский интерфейс, этот поток не может в то же время получать какие-либо пользовательские команды, поэтому он "зависает".
Решение состоит в том, чтобы запустить новыйпоток и выполнять запросы параллельно, а затем использовать что-то вроде SwingUtilities.invokeLater
для обновления пользовательского интерфейса.Что-то вроде:
// button action listener code
Thread t = new Thread(new Runnable() {
public void run() {
// execute query here
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// update the ui here
}
});
}
});
t.start();
SwingUtilities.invokeLater
эффективно ставит в очередь действие обновления, пока все ожидающие события в потоке пользовательского интерфейса не будут обработаны.Прочитайте Javadoc здесь .