private void createProgressPanel() {
		cardLayout = new CardLayout();
		progressPanel = new JPanel(cardLayout);

		if (defaultComponent == null) {
			progressPanel.setVisible(false);
		}
		else {
			progressPanel.add(defaultComponent, DEFAULT);
		}

		monitor = new TaskMonitorComponent();
		progressPanel.add(monitor, PROGRESS);
	}
Helper class to execute a Runnable in a separate thread and provides a
progress monitor component that is shown as needed. This class can support several
different scheduling models described below.
<p>
1) Only allow one runnable at any given time.  In this model, a new runnable will cause any running
runnable to be cancelled and the new runnable will begin running. Because of this, there will
never be any runnables waiting in the queue. Use the {@link #runNow(MonitoredRunnable, String)} 
method to get this behavior.
<p>
2) Allow one running runnable and one pending runnable.  In this mode, any running runnable will be
allowed to complete, but any currently pending runnable will be replaced by the new runnable. Use
the {@link #runNext(MonitoredRunnable, String)} method to get this behavior.
<p>
3) Run all scheduled runnables in the order they are scheduled.  Use the 
{@link #runLater(MonitoredRunnable, String, int)} for this behavior.
<p>
If the given runnable has Swing work to perform after the main Runnable.run() method completes
(e.g., updating Swing components),
the runnable should implement the {@link SwingRunnable} interface and perform this work in
{@link SwingRunnable#swingRun(boolean)}.
<p>
The progress monitor component, retrieved via {@link #getMonitorComponent()}, can be placed
into a Swing widget.  This RunManager will show and hide this progress component as necessary
when runnables are being run.

@see SwingRunnable
Ghidra/Framework/Docking/src/main/java/ghidra/util/task/RunManager.java