首頁 > Java > java教程 > 主體

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

Mary-Kate Olsen
發布: 2024-10-24 05:06:30
原創
551 人瀏覽過

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

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

問題:

問題:

您的目標建立一個程序,連續ping 伺服器並更新JLabel 中的ping 結果。

初始方法:

您的第一次嘗試涉及在formWindowOpened() 事件。雖然這有效,但它只執行了一次任務。

第二種方法:

隨後的努力在 formWindowOpened() 中引入了無限循環。然而,這種方法甚至無法執行一次 setPing() 方法。

使用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>
登入後複製
要解決此問題,請考慮使用Swing Timer安排以預先定義的時間間隔執行長時間運行的任務(在本例中為setPing() 方法)。此方法利用 SwingWorker 在單獨的執行緒上執行 setPing() 方法,從而實現回應能力並避免 GUI 凍結。

以下是實作此方法的程式碼片段:
  • 在此程式碼:
Swing Timer 重複調度 PingWorker 的執行。

SwingWorker 在背景執行 setPing(),完成後更新 GUI。 這種方法確保長時間運行的任務不會阻塞 GUI 線程,保持響應能力,同時定期更新 JLabel 的 ping 結果。

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

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!