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

Java 如何将JLabel文本设置为在系统睡眠前显示,java,swing,sleep,Java,Swing,Sleep,我试图在系统睡眠3000毫秒之前显示成功登录的文本。当我把它放在设定的文本后面时,它就不起作用了。我如何让它显示然后暂停,以便有一点延迟,让用户知道他们登录了 用户正确登录后,它将继续进入另一个类,JFrame将在该类中关闭 l_Message.setForeground(Color.green); l_Message.setText("Succesful Login"); try{ Thread.sleep(3000); } catch(InterruptedException ex

我试图在系统睡眠3000毫秒之前显示成功登录的文本。当我把它放在设定的文本后面时,它就不起作用了。我如何让它显示然后暂停,以便有一点延迟,让用户知道他们登录了

用户正确登录后,它将继续进入另一个类,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);

假设您是从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);
i、 e.将GUI操作计划到GUI线程

有关出现问题的原因,请参阅

有关可能的解决方案,请参阅

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();

不要使用Thread.sleep(),GUI无法重新绘制自身。相反,只需使用
摆动计时器
在3秒后安排您的活动。有关详细信息,请参阅。不要继续睡眠。如果登录不成功怎么办?@YCF_L它只是设置文本而不调用类,因为您(可能)正在以任何方式阻止EDT,
invokeLater
将无法运行,因为,
Runnable
计划在EDT上运行…以后为什么要阻止EDT?
线程。睡眠
将阻止EDT,这将阻止它处理事件队列,您已将
Runnable
发布到该队列中,因此它在
线程返回之前不会运行。因此,这里没有任何东西可以解决OP没有的问题。Thread.sleep将仅阻止当前线程。如果在EDT上运行,则您所说的是正确的。如果这不正确,那么如果程序中的任何线程处于睡眠状态,则永远无法运行任何EventQueue操作。在我的回答中,我假设OP没有在这个线程上运行(尽管措辞可能不恰当),因此这应该是可行的,你没有说过,而且,现在你建议OP违反Swing的单线程特性-一般来说,
thread.sleep
是SwingI最好避免的方法,SwingI就是这么做的。非常感谢。