多次通过点击挥动按钮更改标签文本无法正常工作

时间:2012-07-25 19:14:31

标签: java swing jbutton jlabel

我需要在摇摆中通过一个单击按钮多次更改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");

 }

在此代码状态中,仅设置为end并且start不显示。

2 个答案:

答案 0 :(得分:2)

永远不要在Thread.sleep

中使用Thead.yieldETD

从不,永远不要在ETD中执行任何阻止操作,例如扩展IO或数据处理

标签未更改的原因是您正在停止/阻止ETD,阻止它处理任何重新绘制请求。

查看Concurrency in Swing& The Event Dispatching Thread

答案 1 :(得分:2)

我会尝试使用SwingWorker实例(特别是其doInBackground方法)在与主UI线程不同的线程上执行您在doWork中正在执行的操作。它的编写方式,你的监听方法必然会在执行过程中冻结用户界面,正如你所说,这可能需要很长时间,导致糟糕的用户体验。

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

参考资料:Oracle关于worker threads and SwingWorker的教程,JavaDoc API documentation of the SwingWorker class