Java 如何将JLabel文本设置为在系统睡眠前显示
我试图在系统睡眠3000毫秒之前显示成功登录的文本。当我把它放在设定的文本后面时,它就不起作用了。我如何让它显示然后暂停,以便有一点延迟,让用户知道他们登录了 用户正确登录后,它将继续进入另一个类,JFrame将在该类中关闭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
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就是这么做的。非常感谢。