首页 > Java > java教程 > 正文

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

Barbara Streisand
发布: 2024-10-24 02:35:29
原创
735 人浏览过

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

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

问题:

一个 Java 程序尝试使用长时间运行的任务(ping 服务器)的结果持续更新 JLabel。虽然最初的实现只执行一次任务,但尝试创建重复任务却失败了。

解决方案:

为了解决此问题,该程序使用了两个技术:

  1. 用于重复任务的 Swing 计时器: 计时器内的 ActionListener 以指定的延迟重复调用任务。这里应用这种方法来触发长时间运行的任务。
  2. 用于长时间运行任务的 SwingWorker: SwingWorker 类提供了一种机制,可以在后台线程中执行长时间运行的任务,而不会阻塞主(事件调度)线程。在此上下文中,PingWorker 用于执行 ping 任务。

代码片段:

以下代码结合了这些技术来实现所需的行为:

<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>
登录后复制

说明:

  1. Timer 中的 ActionListener 每隔延迟毫秒触发 SwingWorker 任务(PingWorker)的执行。
  2. PingWorker 在后台执行长时间运行的 ping 任务,完成后返回 ping 时间。
  3. 完成后,PingWorker 中的 did() 方法用结果更新 JLabel。
  4. pingTime() 方法建立到指定主机的套接字连接以测量 ping 时间。

此实现可确保使用最新的 ping 时间重复更新 JLabel,而不影响 GUI 的响应能力。

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

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板