首页  >  文章  >  Java  >  如何使用 Swing Timer 和 SwingWorker 持续更新 JLabel?

如何使用 Swing Timer 和 SwingWorker 持续更新 JLabel?

原创
2024-10-23 22:21:01216浏览

How to Continuously Update a JLabel Using Swing Timer and SwingWorker?

使用 Swing Timer 和 SwingWorker 持续更新 JLabel

为了使用耗时活动的结果定期更新 JLabel,建议同时使用 Swing Timer 和 SwingWorker。 Swing Timer 处理重复性任务,而 SwingWorker 管理耗时的任务。下面是一个示例代码,说明了此策略的运作方式:

<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>

有关事件调度​​线程以及在 GUI 中执行重复或扩展任务的更多详细信息,请查阅 Swing 中的并发文档。

代码的工作原理:

  1. 初始化:LabelUpdateUsingTimer 构造函数初始化一个名为 label 的 JLabel 并设置其字体。
  2. ActionListener 和 Timer:创建一个名为timerListener 的ActionListener,它会每隔delay 毫秒触发PingWorker 的执行。然后使用延迟和timerListener作为参数启动Timer对象,并随后启动它。
  3. JOptionPane:JLabel显示在具有指定主机名或IP的JOptionPane对话框中。
  4. PingWorker:PingWorker 类,SwingWorker 的子类,在后台线程中执行耗时操作。
  5. Ping Time:pingTime 方法建立与指定主机名或 IP 的 TCP 连接并计算延迟。

通过采用此技术,您可以使用耗时任务的最新结果不断更新 JLabel,从而实现实时监控和用户互动。

以上是如何使用 Swing Timer 和 SwingWorker 持续更新 JLabel?的详细内容。更多信息请关注PHP中文网其他相关文章!

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