private void doAlertMessage(Callback alertFinishedCallback) {

		// must be on Swing; this allows us to synchronize the 'alerting' flag
		SystemUtilities
				.assertThisIsTheSwingThread("Alerting must be performed on the Swing thread");

		if (isAlerting) {
			return;
		}

		Callback animatorFinishedCallback = () -> {
			statusLabel.setVisible(true);
			alertFinishedCallback.call();
			isAlerting = false;
		};

		isAlerting = true;

		// Note: manually call validate() so the 'statusLabel' updates its bounds after
		//       the text has been setStatusText() (validation is buffered which means the
		//       normal Swing mechanism may not have yet happened).
		mainPanel.validate();
		statusLabel.setVisible(false); // disable painting in this dialog so we don't see double
		Animator animator = AnimationUtils.pulseComponent(statusLabel, 1);
		if (animator == null) {
			animatorFinishedCallback.call();
		}
		else {
			animator.addTarget(new TimingTargetAdapter() {
				@Override
				public void end() {
					animatorFinishedCallback.call();
				}
			});
		}
	}
Signals for this dialog to visually draw the user's attention to the status text
@param alertFinishedCallback this will be called when the alert is finished.  This allows
       clients to perform work, like re-enabling buttons that were disabled before
       calling this method
Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java