package games.strategy.engine.framework.ui.background; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.SwingUtilities; public class BackgroundTaskRunner { /** Non-blocking. */ public static void runInBackground(final String waitMessage, final Runnable r) { SwingUtilities.invokeLater(() -> { final WaitDialog window = new WaitDialog(null, waitMessage); // this will center the window window.setLocationRelativeTo(null); final AtomicBoolean doneWait = new AtomicBoolean(false); new Thread(() -> { try { r.run(); } finally { // clean up the window SwingUtilities.invokeLater(() -> { doneWait.set(true); window.setVisible(false); window.dispose(); }); } }).start(); if (!doneWait.get()) { window.pack(); window.setVisible(true); } }); } }