2012-07-25 60 views
0

我需要更改jlabel.text几次通过单击按钮在挥杆。在这段代码中,我需要的标签文本之前的DoWork()函数启动,并在中间的进度设置,并设置它的DoWork后结束()(状态类型的JLabel和DoWork的有很长一段时间执行):几次改变标签文本通过单击按钮在挥杆不工作

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     status.setText("start"); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     status.setText("in progress"); 
     dowork(); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     status.setText("end"); 

} 

在此代码状态下,只设置为结束并且不显示开始。

+0

请参阅[进度教程](http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html)关于如何显示进度,或查看可用示例,例如[this酮](http://stackoverflow.com/questions/8916721/java-swing-update-label/8917565#8917565) – Robin 2012-07-25 20:32:50

回答

2

我会尝试使用SwingWorker实例(特别是其doInBackground方法)来完成目前你正在做什么doWork在不同的线程比主UI线程。它的写法是,你的监听器方法在执行期间必然会冻结用户界面,正如你所说,这可能会很长时间,导致用户体验不好。

更改为JLabel文本可能发生在三个不同的地方:第一,就在调用execute之前(即启动)SwingWorker;第二,使用/process机制SwingWorker可用于在用户界面上发布中间结果;第三,在done方法中,只要SwingWorker完成其doInBackground方法的执行,就会在UI线程上再次调用该方法。

参考文献:Oracle的教程worker threads and SwingWorker,JavaDoc API documentation of the SwingWorker class

2

永远,永远使用Thread.sleepThead.yieldETD

永远,永远执行在ETD任何阻塞动作,诸如扩展的IO或数据处理

该标签没有变化的原因是因为您正在阻止/阻止ETD,阻止它处理任何重新绘制请求。

退房Concurrency in Swing & The Event Dispatching Thread