Java随着时间的推移用背景颜色填充JLabel

时间:2014-08-05 10:21:37

标签: java swing

有没有办法从左到右用背景颜色慢慢填充JLabel?

我正在尝试设置某种音频播放器。

所说的文字在JLabel中显示(书写),我希望有一些"动画"当正在播放带有语音文本的文件时。 从左到右穿过JLabel的某种酒吧也会起作用。

我感谢任何帮助/想法。

谢谢!

3 个答案:

答案 0 :(得分:1)

我会在你的JLabel中创建另一个JPanel或JLabel,而不是填充它,它可以提供你想要的任何背景颜色,然后随着时间的推移改变它的大小。 这会给你带来同样的效果。

另一种更复杂的方法是将另一个JLabel隐藏在状态栏的左侧,然后将其向右移动,使其慢慢显示。绝对不是这样做的好方法。

如果您使用JavaFX,您可以在那里找到一个进度条,这可能是编写状态栏的最佳方式,但如果您现在不使用它,可能也是最复杂的。

答案 1 :(得分:0)

是的,但它需要你使用计时器,我不知道你对它有多熟悉。

但下面是一个缓慢填充组件(JPanel)的应用程序,颜色显示进度

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 *
 * @author Olubori
 */
public class MusicBar extends JFrame{

    /**
     * @param args the command line arguments
     */
    JPanel [] lab;
    Timer tim;
    public MusicBar()
    {
        JPanel pan = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
        lab = new JPanel[20];

        for(int i = 0; i<lab.length; i++)
        {
            lab[i] = new JPanel();
            lab[i].setBackground(Color.red);
            pan.add(lab[i]);
        }



        tim = new Timer(2000, new ActionListener() {


            int i = 0;
            @Override
            public void actionPerformed(ActionEvent e) {
               lab[i].setBackground(Color.blue);
               i++;
               if(i==lab.length)
                   tim.stop();
            }
        });

        tim.start();

        this.add(pan);


    }



    public static void main(String[] args) {
        // TODO code application logic here
        MusicBar mb = new MusicBar();

        mb.setSize(500, 500);
        mb.setVisible(true);
         mb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


}

要在您的应用程序中使用此功能,您可能需要获取要播放的文件的持续时间将其转换为秒并将其除以此处为20的面板数量,然后将其乘以1000以使计时器延迟

首先运行代码,然后根据您的应用修改代码。

答案 2 :(得分:0)

这是一个模拟标签,实际上是一个JPanel,它包含一个JLabel数组,一个用于标签文本中的每个字母。

ProgressLabel控制“动画”逻辑。呼叫者只是停下来启动它。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ProgressLabelDemo implements Runnable
{  
  public static void main(String[] args)
  {
    EventQueue.invokeLater(new ProgressLabelDemo());
  }

  public void run()
  {
    final ProgressLabel progressLabel =
        new ProgressLabel("Testing", 500, Color.YELLOW);

    JButton btnStart = new JButton("Start");
    btnStart.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent event)
      {
        progressLabel.start();
      }
    });

    JButton btnReset = new JButton("Reset");
    btnReset.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent event)
      {
        progressLabel.reset();
      }
    });

    JPanel pnlButtons = new JPanel();
    pnlButtons.add(btnStart);
    pnlButtons.add(btnReset);

    JFrame frame = new JFrame("Progress Label Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(progressLabel, BorderLayout.NORTH);
    frame.add(pnlButtons,    BorderLayout.SOUTH);
    frame.setLocationByPlatform(true);
    frame.setSize(300,  100);
    frame.setVisible(true);
  }

  public class ProgressLabel extends JPanel
  {
    private JLabel[] labels;
    private Timer timer;
    private int labelIndex = 0;

    public ProgressLabel(String text, int delay, final Color progressColor)
    {
      setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

      int size = text.length();
      labels = new JLabel[size];

      for (int i = 0; i < size; i++)
      {
        String s = String.valueOf(text.charAt(i));
        labels[i] = new JLabel(s);
        labels[i].setOpaque(true);
        add(labels[i]);
      }

      timer = new Timer(delay, new ActionListener()
      {
        public void actionPerformed(ActionEvent event)
        {
          showProgress(progressColor);
        }
      });
    }

    private void showProgress(Color bgColor)
    {
      if (labelIndex < labels.length)
      {
        labels[labelIndex].setBackground(bgColor);
        labels[labelIndex].revalidate();
        labels[labelIndex].repaint();
        labelIndex++;
      }
      else
      {
        timer.stop();
      }
    }

    public void start()
    {
      timer.start();
    }

    public void reset()
    {
      timer.stop();
      labelIndex = 0;

      for (int i = 0; i < labels.length; i++)
      {
        labels[i].setBackground(new JLabel().getBackground());
      }
    }
  }
}