【问题标题】:several times change label text by clicking button in swing not work通过单击swing中的按钮多次更改标签文本不起作用
【发布时间】:2012-07-25 19:14:30
【问题描述】:

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

 }

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

【问题讨论】:

标签: java swing jbutton jlabel


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    永远不要在ETD 中使用Thread.sleepThead.yield

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

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

    查看Concurrency in SwingThe Event Dispatching Thread

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多