首页  >  文章  >  Java  >  如何使用长时间运行任务的结果持续更新 JLabel?

如何使用长时间运行任务的结果持续更新 JLabel?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-24 05:06:30540浏览

How to Continuously Update JLabel with Results of Long-Running Task?

使用长时间运行任务的结果更新 JLabel

问题:

您的目标创建一个程序,连续 ping 服务器并更新 JLabel 中的 ping 结果。

初始方法:

您的第一次尝试涉及在formWindowOpened() 事件。虽然这有效,但它只执行了一次任务。

第二种方法:

随后的努力在 formWindowOpened() 中引入了无限循环。然而,这种方法甚至无法执行一次 setPing() 方法。

使用 Swing Timer 和 SwingWorker 的解决方案:

要解决此问题,请考虑使用 Swing Timer安排以预定义的时间间隔执行长时间运行的任务(在本例中为 setPing() 方法)。此方法利用 SwingWorker 在单独的线程上执行 setPing() 方法,从而实现响应能力并避免 GUI 冻结。

以下是实现此方法的代码片段:

<code class="java">import java.awt.event.*;
import javax.swing.*;
import java.net.Socket;

public class LabelUpdateUsingTimer {

    static String hostnameOrIP = "stackoverflow.com";
    int delay = 5000;
    JLabel label = new JLabel("0000");

    LabelUpdateUsingTimer() {
        label.setFont(label.getFont().deriveFont(120f));

        ActionListener timerListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new PingWorker().execute();
            }
        };
        Timer timer = new Timer(delay, timerListener);

        timer.start();
        JOptionPane.showMessageDialog(
                null, label, hostnameOrIP, JOptionPane.INFORMATION_MESSAGE);
        timer.stop();
    }

    class PingWorker extends SwingWorker {

        int time;

        @Override
        protected Object doInBackground() throws Exception {
            time = pingTime();
            return new Integer(time);
        }

        @Override
        protected void done() {
            label.setText("" + time);
        }
    };

    public static int pingTime() {
        Socket socket = null;
        long start = System.currentTimeMillis();
        try {
            socket = new Socket(hostnameOrIP, 80);
        } catch (Exception weTried) {
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (Exception weTried) {}
            }
        }
        long end = System.currentTimeMillis();
        return (int) (end - start);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new LabelUpdateUsingTimer();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}</code>

在此代码:

  • Swing Timer 重复调度 PingWorker 的执行。
  • SwingWorker 在后台执行 setPing(),完成后更新 GUI。

这种方法确保长时间运行的任务不会阻塞 GUI 线程,保持响应能力,同时定期更新 JLabel 的 ping 结果。

以上是如何使用长时间运行任务的结果持续更新 JLabel?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn