使用java多线程方法sleep()创建闪烁文本

时间:2014-04-08 06:20:19

标签: java multithreading swing

我通过使用线程处理方法创建一个闪烁的文本框架,这是我的代码:

import javax.swing.*;

public class FlashingText extends JApplet implements Runnable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JLabel            jlblText         = new JLabel("welcome",JLabel.CENTER);

    public FlashingText() {
        add(jlblText);
        new Thread(this).start();
    }

    @Override
    public void run() {
        try {
            while(true) {
                if(jlblText.getText() == null) {
                    jlblText.setText("Welcome");
                    Thread.sleep(2000);
                } else
                    jlblText.setText(null);
            }
        } catch(InterruptedException ex) {

        }
    }
}

在我编译并运行它之后,似乎文本根本没有闪烁 我的代码有什么问题吗? 非常感谢!

3 个答案:

答案 0 :(得分:2)

有一个更好的解决方案,可以更新事件调度程序线程中的UI,但不会阻止它。

    final JLabel label = new JLabel("Some text");
    final Runnable updater = new Runnable() {
        @Override
        public void run() {
            label.setVisible(!label.isVisible());
        }
    };

    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            SwingUtilities.invokeLater(updater);
        }
    }, 2, 2, TimeUnit.SECONDS);

答案 1 :(得分:1)

从代码中看,你似乎并没有闪现任何东西。我在您的代码中看到的一些问题:

  • 如果标签没有文字,getText()方法将产生空字符串(""),而不是null
  • 更新可视组件时,您需要通过事件调度程序线程(EDT)。这通过SwingUtilities.invokeLater(Runnable runnable)课程向您展示。
  • sleep()线程通常是一个坏主意。如果您通过EDT进行更改,您将挂起ED线程,这将导致应用程序UI冻结,这是不希望的。
  • 您正在吞咽异常。在您的异常处理中,您没有做任何事情。不处理异常被认为是不好的做法(有时简单的日志消息会这样做)。

答案 2 :(得分:0)

据我所知,以下代码块存在问题:

    try {
        while(true) {
            if(jlblText.getText() == null) {
                jlblText.setText("Welcome");
                Thread.sleep(2000);
            } else
                jlblText.setText(null);
        }
    }

因为第一次看到值是欢迎的,所以它将进入循环并转到else并将其设置为null然后立即再次检查,因为其他地方没有睡眠因此它将再次检查并输入if块并设置为欢迎,整个过程将以极快的速度完成,因此您将无法看到闪烁的效果。所以我认为你应该尝试在else块的末尾进行一次睡眠,看看,根据我的说法它应该可以工作。 你应该改变:

 else
     jlblText.setText(null);

 else{
     jlblText.setText(null);
     Thread.sleep(500);
 }

或类似的东西