我正在编写一个执行某项任务的应用程序,并在成功完成任务后通知用户。告知用户我正在使用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。那是问题吗?我想最初显示带有背景颜色的标签,然后逐渐消失。
答案 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可能不会很好。有SwingWorker
和SwingUtilities.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);
}
}
}