首頁  >  文章  >  Java  >  如何使用長時間運行的任務結果持續更新 JLabel?

如何使用長時間運行的任務結果持續更新 JLabel?

Barbara Streisand
Barbara Streisand原創
2024-10-24 02:35:29662瀏覽

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

使用長時間運行任務的結果重複更新JLabel

問題:

問題:

一個

問題:
    解決方案:
  1. 為了解決此問題,程式使用了兩個技術:
  2. 用於重複任務的Swing 計時器:
  3. 計時器內的ActionListener 以指定的延遲重複呼叫任務。這裡應用這種方法來觸發長時間運行的任務。

用於長時間運行任務的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. 說明:
  2. Timer 中的ActionListener 每隔延遲毫秒觸發SwingWorker 任務(PingWorker)的執行。
  3. PingWorker 在背景執行長時間運行的 ping 任務,完成後返回 ping 時間。

完成後,PingWorker 中的 did() 方法用結果更新 JLabel。

pingTime() 方法建立到指定主機的套接字連線以測量 ping 時間。 此實作可確保使用最新的 ping 時間重複更新 JLabel,而不會影響 GUI 的回應能力。

以上是如何使用長時間運行的任務結果持續更新 JLabel?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn