3

我打算编写控制 JLabel 闪烁三次的 Java 代码,然后在第三次闪烁后使其中的文本保持透明/“消失”。

正如下面的代码所示,我已经能够编写一个持续闪烁的 JLabel,但想创建一个只闪烁 3 次的 JLabel,然后使其中的文本保持透明。

public class BlinkLabel extends JLabel {

      private static final long serialVersionUID = 1L;

      private static final int BLINKING_RATE = 1000; // in ms

      private boolean blinkingOn = true;

      public Timer timer;

      public BlinkLabel(String text) {
        super(text);            
        timer = new Timer( BLINKING_RATE , new TimerListenerTwo());
        timer.setInitialDelay(0);
        timer.start();

      }

      public void setBlinking(boolean flag) {
        this.blinkingOn = flag;
      }

      public boolean getBlinking(boolean flag) {
        return this.blinkingOn;
      }

      public class TimerListenerTwo implements ActionListener{
            int counter = 1;

            public TimerListenerTwo() {

            }

            public void actionPerformed(ActionEvent evt){
                if(counter == 3){//3 = YOUR MAX
                    timer.stop();
                }
                counter++;
            }
       }
}

我将上述函数调用如下:

BlinkLabel label = new BlinkLabel("");
label.setText("Blink blink");

如何编辑上面的代码以使 JLabel 闪烁三次并使文本消失。

非常感谢任何想法/建议。

4

6 回答 6

3

它非常简单,在您的 JFrame 或 JDialog 中创建一个子类。

class LbBlink implements ActionListener {  
        private javax.swing.JLabel label;
        private java.awt.Color cor1 = java.awt.Color.red;
        private java.awt.Color cor2 = java.awt.Color.gray;
        private int count;

        public LbBlink(javax.swing.JLabel label){
            this.label = label;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            if(count % 2 == 0)
                label.setForeground(cor1);
            else
                label.setForeground(cor2);
            count++;
        }  
    }

在你的类中声明一个变量。

private Timer timerLB;

之后,在您的类构造中设置变量。

timerLB = new Timer(1000, new "Your Class".LbBlink("Your jLabel"));

最后,在您的应用程序中,开始闪烁

timerLB.start();

并停止:

timerLB.stop();
于 2013-08-13T13:26:14.003 回答
3

尝试使用 acounter并增加counter每一个blink,如果计数器为 3,则清除标签的文本setText("")

编辑

class TimerListener implements ActionListener{
    int counter = 1;

    public void actionPerformed(ActionEvent evt){
        if(counter == 3){//3 = YOUR MAX
            timer.stop();
        }
        counter++;
    }
}
于 2013-07-08T10:16:59.420 回答
2

含义代码行

  public void setBlinking(boolean flag) {
    this.blinkingOn = flag;
  }

  public boolean getBlinking(boolean flag) {
    return this.blinkingOn;
  }
  • 在您的情况下Swing Action,对(已经可见的)Swing GUI 的每次更改都将在内部完成ActionListener

  • 那里(也许)没有理由对 JLabel 进行子类化,为JLabel, Swing Timer,创建一个局部变量

  • 我想念那里的代码Timer.setRepeats(boolean)

于 2013-07-08T10:38:43.927 回答
1

计数闪烁,当它足够时停止您的计时器。

于 2013-07-08T10:19:31.130 回答
0

不需要计时器。只需使用 THREAD,我们就可以做到。

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

class Sample {
   int i;
   private JFrame f;
   private JLabel l;

Sample() throws InterruptedException {
    f = new JFrame("test");
    f.setSize(400, 400);
    l = new JLabel("Testing");
    f.add(l);
    f.setVisible(true);

    for (i = 0; i < 6; i++) {
        if (i % 2 == 0) {
            l.setForeground(Color.red);
        } else {
            l.setForeground(Color.BLUE);
        }
        Thread.sleep(500);
    }
    l.setEnabled(false);

}

public static void main(String a[]) throws InterruptedException {
    new Sample();
}

}

于 2014-10-17T07:23:11.977 回答
0

有人建议使用 displayHelpMessage(参考: https ://blog.ajduke.in/2014/03/31/java-how-to-schedule-a-task-to-run-in-an-interval/ )

因此,我使用它并开发了在下面的 JLabel(messageLabel) 上闪烁 3 次给定文本的 Java 代码。希望这会帮助那里的人。

    static int counter = 0;
    static ScheduledExecutorService service;

    void displayHelpMessage(String message) 
    {
        Runnable runnable = new Runnable() {
            public void run() {
                // task to run goes here
                if (counter++ >= 6) {
                    service.shutdown();
                    counter = 0;
                } else {
                    if (counter % 2 == 1) {
                        messageLabel.setForeground(Color.red);
                    } else {
                        messageLabel.setForeground(Color.black);
                    }
                }
            }
        };
        messageLabel.setText(message);
        service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runnable, 0, 750, TimeUnit.MILLISECONDS);
    }   

// Call examples:       
    displayHelpMessage("How to select panel");        
    displayHelpMessage("Key to use complete create/modify");
于 2016-06-25T03:06:24.760 回答