如何设置 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 文本在系统睡眠前显示的主要内容,如果未能解决你的问题,请参考以下文章