让JLabel消失

时间:2010-07-17 09:54:04

标签: java swing

我正在编写一个执行某项任务的应用程序,并在成功完成任务后通知用户。告知用户我正在使用jlabel。我希望这个jlabel在一段时间后显示消息和后退。我使用netbeans作为我的IDE。

这是我班级的架构。

摘要,GUI代码

abstract class Admin extends JFrame{
  protected static jlabel lbl_message= new jlabel("some text");
  // other functions and variables

  abstarct protected void performButtonClickAction();

}

实现抽象函数和提供其他功能的类。

final class AdminActionPerformer extends Admin{
  final public void performButtonClickAction(){
     // code for doin the task
     if(task is successful){
         new Thread(new Fader(Admin.lbl_message)).start();
     }
  }

 public static void main(String[] args) {
    new AdminActionPerformer().setVisible(true);
 }

}

制作Jlabel后退的线程

class Fader implements Runnable{
  javax.swing.JLabel label;
  Color c;

  Fader(javax.swing.JLabel label){
    this.label=label;
    c=label.getBackground();
  }

  public void run() {
    int alpha=label.getGraphics().getColor().getAlpha()-5;
    while(alpha>0){
        System.out.println(alpha);
        alpha-=25;
        label.getGraphics().setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha));
        label.repaint();
        try {
            Thread.sleep(50);
        } catch (InterruptedException ex) {
            Logger.getLogger(Fader.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
  }
}

但标签并没有后退。我在这做错了什么?谢谢:))

P.S。我设置了JLabel opaque true。那是问题吗?我想最初显示带有背景颜色的标签,然后逐渐消失。

5 个答案:

答案 0 :(得分:5)

如果你正在做很多效果,你可以使用一个摇摆动画库,比如Trident。这是淡出标签的方法。

   JLabel label = ....;
   Timeline timeline = new Timeline(label);
   timeline.addPropertyToInterpolate("background", label.getBackground(), 
     new Color(label.getBackground().getRGB(), true));
   timeline.addPropertyToInterpolate("foreground", label.getForeground(), 
      new Color(label.getForeground().getRGB(), true));
   timeline.play();

编辑:更新以更改前景/背景颜色,这是标签上的属性。但是,对于生产代码,我会将标签包装在一个容器中,该容器可以将alpha应用于它的子项,然后您可以以组件中立的方式淡入/淡出组件。其中一个动画套件中有一个组件,但我现在找不到它......

答案 1 :(得分:4)

这是example使用Alpha透明度来淡化文字信息。

答案 2 :(得分:3)

我同意约翰内斯的观点,即从不同的线程更新UI可能不会很好。有SwingWorkerSwingUtilities.invokeLater等机制可以解决您的错误线程问题。

然而,我看到的更大的问题是,你正在与你的JLabel争论谁。 JLabel是一个普通的组件,每当它的容器被刷新时,它就会以其通常的颜色重新绘制。这是“谁最后画,赢。”的案例。

另类建议:为什么不只是摆弄标签的颜色属性?如果使前景色接近背景色,则会看到它褪色。当您更改颜色时,标签将重新绘制自己,或者您可以使用update()repaint()强制重新绘制,我会忘记它。

修改

我想我认为这不起作用的真正原因。您正在设置标签的图形上下文的颜色。这没效果!任何涂抹其自身部分的组件都会在绘制任何东西之前立即设置颜色,即将其刷子浸入墨水中。当然,它为绘制字符字形而设置的颜色是原始标签颜色。只有标签绘画代码在绘图前愚蠢地忘记设置颜色时,您的方法才有效。

答案 3 :(得分:1)

可能你可以试试API方法......

用com.sun.awt.AWTUtilities技巧给出! :d

答案 4 :(得分:1)

enter link description here我也在寻找一种通过逐渐淡出来改变JLabel内容的好方法。以下代码非常好用。它还没有用于淡化图标的代码。但这不应该太难。请注意,它需要运行当前版本的TimingFramework(timingframework-swing-4.1)。

我希望它可能有用。

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;

public class FadingLabel extends JLabel {
    protected Animator animator;
    protected String newLabelText;

    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() {

            @Override
            public void repeat(Animator source) {
                setText(newLabelText);
            }

            @Override
            public void timingEvent(Animator animator, double fraction) {
                int alpha = new Double(255 * fraction).intValue();
                setForeground(new Color(getForeground().getRed(), getForeground().getGreen(), getForeground().getBlue(), alpha));
                repaint();
            }

        }).build();
    }


    @Override
    public void setText(String s) {
        if (animator != null && !animator.isRunning()) {
            newLabelText = s;
            animator.start();
        } else {
            super.setText(s);
        }
    }
}