Заставить JLabel исчезнуть - PullRequest
3 голосов
/ 17 июля 2010

Я пишу приложение, которое выполняет какую-то задачу и информирует пользователя об успешном завершении задачи.Для информирования пользователя я использую 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);
        }
     }
  }
}

Но этикетка не исчезает.Что я здесь не так делаю?Спасибо:)

PS Я установил JLabel непрозрачным true.Это проблема?Сначала я хочу отобразить метку с цветом фона, а затем заставить ее исчезнуть.

Ответы [ 5 ]

5 голосов
/ 17 июля 2010

Если вы делаете много эффектов, вы можете использовать библиотеку анимации свинга, например 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();

РЕДАКТИРОВАТЬ: Обновлено, чтобы изменить цвета переднего плана / фона, которые являются свойствами на этикетке.Тем не менее, для производственного кода я бы поместил метку в контейнер, который может применять альфа к его дочерним элементам, а затем вы можете постепенно добавлять / выводить компонент независимым от компонента способом.В одном из наборов анимации есть компонент для этого, но я не могу сейчас его найти ...

4 голосов
/ 17 июля 2010

Вот пример , использующий альфа-прозрачность для затухания текстового сообщения.

3 голосов
/ 17 июля 2010

Я согласен с Йоханнесом, что обновление вашего пользовательского интерфейса из другого потока, скорее всего, не будет работать хорошо. Существуют механизмы, такие как SwingWorker и SwingUtilities.invokeLater, которые могут решить ваши проблемы с ошибками.

Однако большая проблема, которую я вижу, заключается в том, что вы сражаетесь со своей JLabel за то, кто ее рисует. JLabel - это обычный компонент, и всякий раз, когда его контейнер обновляется, он перекрашивает себя в свои обычные цвета. Это тот случай, когда «кто красит последним, тот побеждает».

Альтернативное предложение: почему бы просто не поиграть с атрибутом цвета метки? Если вы сделаете цвет переднего плана близким к цвету фона, он будет выглядеть как блеклый. Ярлык либо сам перекрасится, когда вы измените его цвет, либо вы можете принудительно перекрасить, используя update() или repaint(), я постоянно забываю, какой.

EDIT

Мне кажется, я вижу реальную причину, по которой это не работает. Вы устанавливаете цвет графического контекста метки. Это не имеет никакого эффекта! Любой компонент, который рисует части самого себя, будет устанавливать цвет, то есть погружать свою кисть в чернила, непосредственно перед рисованием чего-либо. И, конечно же, цвет, который он устанавливает для отрисовки символов, является исходным цветом метки. Ваш метод будет работать только в том случае, если код рисования метки по глупости забыл установить цвет перед рисованием.

1 голос
/ 27 марта 2012

введите описание ссылки здесь Я также искал хороший способ изменить содержимое JLabel путем постепенного исчезновения и повторного ввода. Следующий код работает довольно хорошо. У него пока нет кода для исчезновения иконки. Но это не должно быть слишком сложно. Обратите внимание, что для запуска требуется текущая версия TimingFramework (timesframework-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);
        }
    }
}
1 голос
/ 02 июля 2011

возможно, вы могли бы попробовать метод API ...

, заданный с помощью хитростей com.sun.awt.AWTUtilities!: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...