如何设置 JLabel 文本在系统睡眠前显示

Posted

技术标签:

【中文标题】如何设置 JLabel 文本在系统睡眠前显示【英文标题】:How to set JLabel text to display before a system sleep 【发布时间】:2017-10-17 10:57:39 【问题描述】:

我试图在系统休眠 3,000 毫秒之前显示成功登录的文本。当我将它放在设置的文本之后时它不起作用。如何让它显示然后暂停,以便有一点延迟,以便用户知道他们正在登录?

用户正确登录后,它将继续进入另一个 JFrame 将关闭的类

l_Message.setForeground(Color.green);
l_Message.setText("Succesful Login");

try
    Thread.sleep(3000);
 catch(InterruptedException ex) 
    Thread.currentThread().interrupt();


PLOGIN post_login = new PLOGIN();
post_login.postlogin_UI(login_JFrame);

【问题讨论】:

不要使用 Thread.sleep(),GUI 不能自己重绘。相反,只需使用Swing Timer 在 3 秒后安排您的活动。请参阅How to Use Swing Timers 了解更多信息。 不要睡EDT。 登录不成功怎么办? @YCF_L 它只是设置文本而不调用类 【参考方案1】:

假设您是从 GUI 线程外部调用它(我相信您应该这样做),您可以尝试以下操作:

    EventQueue.invokeLater(() -> 
        l_Message.setForeground(Color.green);
        l_Message.setText("Succesful Login");
    );

    try
        Thread.sleep(3000);
     catch(InterruptedException ex) 
        Thread.currentThread().interrupt();
    

    PLOGIN post_login = new PLOGIN();
    post_login.postlogin_UI(login_JFrame);

即将 GUI 操作调度到 GUI 线程

【讨论】:

由于您(可能)以任何方式阻止 EDT,invokeLater 将无法运行,因为 Runnable 计划在 EDT 上运行......稍后跨度> 为什么要阻止 EDT? Thread.sleep 将阻止 EDT,这将阻止它处理您已将 Runnable 发布到其中的事件队列,因此在 Thread.sleep 返回之前它不会运行,所以,这里没有任何东西可以解决 OP 遇到的问题 没有。 Thread.sleep 只会阻塞当前线程。如果在 EDT 上运行,那么您所说的是正确的。如果这不正确,那么如果程序中的任何线程正在休眠,您将永远无法运行任何 EventQueue 操作。我在我的回答中假设(虽然可能措辞不佳)OP 没有在这个线程上运行,因此这应该可以工作 所以,你没有这么说,现在你建议 OP 违反了 Swing 的单线程性质 - 作为一般规则,最好在 Swing 中避免使用 Thread.sleep跨度> 【参考方案2】:

请参阅Concurrency in Swing 了解您遇到问题的原因

请参阅How to use Swing Timers 了解可能的解决方案

import javax.swing.Timer

//...

l_Message.setForeground(Color.green);
l_Message.setText("Succesful Login");
Timer timer = new Timer(3000, new ActionListener() 
    @Override
    public void actionPerformed(ActionEvent e) 
        PLOGIN post_login = new PLOGIN();
        post_login.postlogin_UI(login_JFrame);
    
);
timer.start();

【讨论】:

我只是在这样做。谢谢

以上是关于如何设置 JLabel 文本在系统睡眠前显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在JLabel中包装文本?

垂直轴中间的 Java JLabel 文本

当显示 HTML 文本时,JLabel 禁用时不灰显

字体与系统字体冲突时Java JLabel HTML显示乱码

如何更新JLabel文本?

JLabel 保留以前的文本