Как я могу (должен) это сделать? Есть ли надежная, но краткая идиома для этого? Это близко?
Проблема в том, что Swing не является потокобезопасным, поэтому, если операция включает в себя какое-либо взаимодействие с компонентами Swing, вам придется пойти на риск возникновения многопоточных проблем. Поскольку отображаемый диалог блокируется, вы не можете использовать этот заблокированный поток ETD для чего-либо.
Операция в нашем приложении действительно включает в себя вызовы БД, а также взаимодействие с компонентами Swing. Разделить эти два понятия не так уж и тривиально. Он выполняется, когда пользователь выбирает вкладку JTabbedPane.
Код: Выделить всё
// assuming it's invoked by some ActionListener
private void performWithProgressDialog(String title, Runnable runnable) {
WaitingDlg waitingDialog = WaitingDlg.withTitle(title);
waitingDialog.showAsync(); // calls setVisible(true) on the EDT
CompletableFuture.runAsync(runnable, Executors.newCachedThreadPool()::submit /* not EDT — bad, but what can I do*/).thenRun(waitingDialog::dispose);
Подробнее здесь: https://stackoverflow.com/questions/797 ... ess-dialog
Мобильная версия