package op.tools;
import org.jdesktop.core.animation.timing.Animator;
import org.jdesktop.core.animation.timing.TimingSource;
import org.jdesktop.core.animation.timing.TimingTargetAdapter;
import org.jdesktop.swing.animation.timing.sources.SwingTimerTimingSource;
import javax.swing.*;
import java.awt.*;
import java.util.concurrent.TimeUnit;
/**
* Dieser Label blendet sanft um, wenn sein Text geändert wird. Dazu verwendet er das TimingFramework und seinen AlphaComposite Wert.
*/
public class FadingLabel extends JLabel {
protected Animator animator;
protected String newLabelText;
protected float opacity = 1.0f;
public FadingLabel(String s, Icon icon, int i) {
super(s, icon, i);
initAnimator();
}
public FadingLabel(String s, int i) {
super(s, i);
initAnimator();
}
public FadingLabel(String s) {
super(s);
initAnimator();
}
public FadingLabel(Icon icon, int i) {
super(icon, i);
initAnimator();
}
public FadingLabel(Icon icon) {
super(icon);
initAnimator();
}
public FadingLabel() {
super();
initAnimator();
}
protected void initAnimator() {
final TimingSource ts = new SwingTimerTimingSource();
Animator.setDefaultTimingSource(ts);
ts.init();
animator = new Animator.Builder().setDuration(250, TimeUnit.MILLISECONDS).setRepeatCount(2).setRepeatBehavior(Animator.RepeatBehavior.REVERSE).setStartDirection(Animator.Direction.BACKWARD).addTarget(new TimingTargetAdapter() {
String prevString;
@Override
public void begin(Animator source) {
opacity = 1.0f;
repaint();
}
@Override
public void timingEvent(Animator animator, double fraction) {
// Nur setzen beim Einblenden und auch nur dann, wenn sich der String geändert hat.
if (animator.getCurrentDirection() == Animator.Direction.FORWARD) {
if (SYSTools.catchNull(prevString).equals(SYSTools.catchNull(newLabelText))) {
setTextSuper(newLabelText);
}
prevString = newLabelText;
}
opacity = new Double(fraction).floatValue();
repaint();
}
@Override
public void end(Animator source) {
opacity = 1.0f;
repaint();
}
}).build();
}
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
super.paint(g2);
g2.dispose();
}
@Override
public void setText(String s) {
if (SYSTools.catchNull(s).equals(SYSTools.catchNull(newLabelText))) {
return;
}
newLabelText = s;
if (animator != null && !animator.isRunning()) {
animator.start();
}
}
private void setTextSuper(String text) {
super.setText(text);
}
}