java - 多次通过单击 swing 中的按钮更改标签文本不起作用

标签 java swing jbutton jlabel

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

 }

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

最佳答案

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

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

引用文献:Oracle关于worker threads and SwingWorker的教程, JavaDoc API documentation of the SwingWorker class .

关于java - 多次通过单击 swing 中的按钮更改标签文本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11656927/

相关文章:

java - 从 JSON 字符串中删除双引号

java - 如何初始化继承的值,并使用抽象方法c++?

java - 自定义滚动条箭头

java - 向 JPanel 添加滚动

java - 按下时停止 JButton 突出显示

java - JButton 需要使用数组修改 8 个 JTextField。听按钮还是听文本?

java - 与 apache commons-vfs2 的连接过多

java - 如何使用带接口(interface)的类型转换?

java - 如何将两个不同级别的过滤器添加到同一个 GlazedList 表中?

java - 用新的 JButton 替换旧的 JButton