为什么 setText 不适用于 JLabel 组件?



我有一个JLabel,我想暂时更改,这是我为此编写的代码:

infoLabel.setText("Added");
try {
   TimeUnit.MILLISECONDS.sleep(300);
}
catch(InterruptedException ex)
{
}
infoLabel.setText("Action"); //funny part is when I comment this line it works

标签的默认文本是"操作"

Swing 是一个单线程框架工作,这意味着,如果你做任何停止这个线程的事情,那么它就无法响应任何新事件,包括绘画请求。

基本上,TimeUnit.MILLISECONDS.sleep(300)导致事件调度线程进入睡眠状态,阻止它处理任何新的绘制请求(以及其他内容)。

相反,您应该使用javax.swing.Timer

看看

  • 摇摆中的并发
  • 如何使用摆动计时器

更多详情

例如。。。

infoLabel.setText("Added");
Timer timer = new Timer(300, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        infoLabel.setText("Action");
    }
});
timer.setRepeats(false);
timer.start();

请注意,300 毫秒是一个非常短的时间,您可能希望从稍大一点的值开始,例如 2000,即 2 秒;)

您正在使 Swing 事件线程进入睡眠状态,使整个 GUI 进入睡眠状态。别这样。请改用摆动计时器。

您的应用程序在单个线程上运行,因此当您休眠线程时,会阻止它进行任何 GUI 更新。

你确定你做事正确吗?通过在 GUI 线程中执行所有操作(包括睡眠),它将始终处于繁忙状态,并且永远不会返回到 Java 以便重新绘制 GUI。

搜索 EDT(事件调度线程)以获取详细信息。 这里有一个关于这个主题的问题:处理代码不起作用(Threads,draw(),noLoop()和loop())

最新更新