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

 }

在此代码状态仅设置为结束和开始不显示。

4

2 回答 2

2

永远,永远不要使用Thread.sleep,Thead.yieldETD

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

标签没有改变的原因是因为你正在拖延/阻止ETD,阻止它处理任何重绘请求。

查看Swing 中的并发性事件调度线程

于 2012-07-25T20:04:27.933 回答
2

我会尝试使用一个SwingWorker实例(特别是它的doInBackground方法)来执行您当前在doWork与主 UI 线程不同的线程上执行的操作。它的编写方式,您的侦听器方法必然会在执行期间冻结用户界面,正如您所说,这可能会很长时间,从而导致糟糕的用户体验。

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

参考资料:Oracle 的工作线程教程和SwingWorker的JavaDoc API文档SwingWorker

于 2012-07-25T20:05:19.327 回答