2015-10-13 46 views
0

我想要创建一个小循环,在按下GUI上的按钮之后,每秒的值都会改变;我曾尝试使用线程,但我似乎无法让它正常工作。现在发生的情况是,程序在按下按钮之后会暂停10秒。你可以帮帮我吗?Java:在线程中更改标签值

这是我的代码是什么样子

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



} 

回答

2

我想你要找的是什么Timer类自带的swing包。有一个阅读the documentation,它应该帮助你解决你的问题。

1

一个简单的规则是使用一个ExecutorService并将您的代码作为可运行的代码运行。这并不会阻止程序的全球流动。记得关闭执行器。

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

} 
+0

'一个简单的规则......'重要的规则是Swing组件应该在'Event Dispatch Thread'上更新。从我所知道的Executor服务不在EDT上运行,因此不应该更新Swing组件。 – camickr

+0

你能提出一些方法或方法来使这个程序工作? –

+0

@KaspervanderHoofd,“你能提出一些方法或方法来使这个程序有效吗?”Jimmy在一小时前给出了答案。 – camickr

0

在动作监听器(或任何事件处理程序)调用Thread.sleep()会导致程序无响应的睡眠()调用的持续时间。

像Java Swing这样的GUI框架通常具有一个可处理所有键盘和鼠标输入的事件调度线程(EDT)。事件处理程序在 EDT中被称为,并且由于只有一个EDT,所以它们必须一次调用一个。直到当前事件的处理程序返回,您的程序才能响应下一个事件。

像吉米Jutt他回答说,正确的方法,以使事情发生后,或在一个GUI程序的周期间隔是使用某种类型的定时器(例如,javax.swing.Timer)。定时器可用于安排将来的定时事件,您可以使用与编写键盘和鼠标事件的处理程序相同的方式编写处理函数。

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