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

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

原創
2024-10-23 22:21:01218瀏覽

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