首頁 > Java > java教程 > 主體

如何在Java中使用Swing Timer和SwingWorker進行高效率的GUI任務管理?

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

How to Use Swing Timer and SwingWorker for Efficient GUI Task Management in Java?

在GUI 中使用Swing Timer 和SwingWorker 執行重複和長時間運行的任務

在圖形使用者介面(GUI) 中,維護應用程式的響應能力至關重要。執行長時間運行或重複的任務,例如網路呼叫或繁重的計算,如果處理不當,可能會凍結 UI。

用於重複任務的Swing 計時器

對於任務對於需要定期重複的操作(例如,使用來自伺服器的資料更新標籤),Swing 提供了Timer類。計時器可以設定一個延遲和一個定義計時器觸發時要執行的動作的 ActionListener。

用於長時間運行任務的 SwingWorker

SwingWorker 是一個 Swing擴展 SwingUtilities 的元件,專為需要較長時間的任務而設計。它允許您在後台執行緒中執行任務,同時保持 UI 回應。任務完成後,SwingWorker 通知主執行緒使用結果更新 UI。

範例:使用伺服器Ping 結果更新標籤

示範結合使用Timer 和SwingWorker,請考慮以下程式碼片段:

<code class="java">import javax.swing.*;
import java.awt.event.*;
import java.net.Socket;

public class LabelUpdateExample {

    private static String hostnameOrIP = "stackoverflow.com";
    private static int delay = 5000;
    private static JLabel label = new JLabel("0000");

    public static void main(String[] args) {
        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();
    }

    private static class PingWorker extends SwingWorker {

        private int time;

        @Override
        protected Object doInBackground() throws Exception {
            time = pingTime();
            return new Integer(time);
        }

        @Override
        protected void done() {
            label.setText("" + time);
        }
    }

    private 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);
    }
}</code>
登入後複製

此程式碼建立一個JLabel,用於顯示指定主機的ping 時間,並使用計時器每5 秒更新一次。 ping 操作是在後台執行緒中使用 SwingWorker 執行的,以避免凍結 UI。 ping 完成後,SwingWorker 將使用結果更新標籤,確保 GUI 在長時間運行的任務期間保持回應。

以上是如何在Java中使用Swing Timer和SwingWorker進行高效率的GUI任務管理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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