Java:在线程化时更改标签值
我想创建一个小循环,在我按下GUI上的按钮后,值将每秒更改; 我试过使用一个线程,但我似乎无法让它正常工作。 现在发生的是程序在按下按钮后暂停10秒钟。 你可以帮帮我吗?
这就是我的代码
private void ButtonActionPerformed(java.awt.event.ActionEvent evt) { for (x = 0; x <= 10; x++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); here. } nummerlabel.setText(String.valueOf(x)); } }
我想你正在寻找的是带有swing
包的Timer
类。 阅读文档 ,它应该可以帮助您解决问题。
一个简单的规则是使用ExecutorService并将代码作为runnable运行。 这不会阻止程序的全局流程。 记得关闭执行程序。
private void ButtonActionPerformed(java.awt.event.ActionEvent evt) { ExecutorService executorService = Executors.newFixedThreadPool(1); for (int x = 0; x <= 10; x++) { final int y=x; executorService.execute(new Runnable() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //nummerLabel should be accessed via final reference nummerlabel.setText(String.valueOf(y)); } }); } executorService.shutdown(); }
在动作侦听器(或任何事件处理程序)中调用Thread.sleep()
将导致程序在sleep()调用期间无响应。
像Java Swing这样的GUI框架通常有一个事件调度线程(EDT)来处理所有键盘和鼠标输入。 在 EDT中调用事件处理程序,因为只有一个EDT,所以必须一次调用它们。 在当前事件的处理程序返回之前,您的程序无法响应下一个事件。
就像Jimmy Jutt在他的回答中所说的那样, 以后在GUI程序中定期发生事情的正确方法是使用某种计时器(例如, javax.swing.Timer
)。 计时器可用于计划未来的定时事件,您可以使用与为密钥和鼠标事件编写处理程序相同的方式编写处理函数。
private void ButtonActionPerformed(java.awt.event.ActionEvent evt) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { for (int i = 0; i <= 10; i++) { nummerlabel.setText(String.valueOf(i)); TimeUnit.SECONDS.sleep(1); } } catch (InterruptedException e) { e.printStackTrace(); } } }); thread.start(); }