我通过使用线程处理方法创建一个闪烁的文本框架,这是我的代码:
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) {
}
}
}
在我编译并运行它之后,似乎文本根本没有闪烁 我的代码有什么问题吗? 非常感谢!
答案 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
。 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);
}
或类似的东西