public Animator createAnimator() {

		if (animator != null) {
			return animator;
		}

		glassPane = AnimationUtils.getGlassPane(component);
		if (glassPane == null) {
			Msg.debug(AnimationUtils.class,
				"Cannot animate without a " + GGlassPane.class.getName() + " installed");
			throw new IllegalStateException("Unable to find Glass Pane");
		}

		if (painter == null) {
			throw new IllegalStateException("A painter must be supplied");
		}

		setCurrentValue(values[0]); // set initial value

		int aniationDuration = (int) duration.toMillis();
		if (!AnimationUtils.isAnimationEnabled()) {
			aniationDuration = 0; // do not animate
		}

		animator = PropertySetter.createAnimator(aniationDuration, this, "currentValue", values);
		animator.setAcceleration(0.2f);
		animator.setDeceleration(0.8f);
		animator.addTarget(new TimingTargetAdapter() {
			@Override
			public void end() {
				done();
			}
		});

		return animator;
	}
Creates the animator used to perform animation.  Clients will call {@link Animator#start()}
to begin animation.  Many attributes of the animator can be configured before starting. 
@return the animator
@throws IllegalStateException if require values have not been set on this class, such as 
{@link #setValues(Double...)} or {@link #setPainter(AnimationPainter)}.
Ghidra/Framework/Docking/src/main/java/docking/util/AnimationRunner.java